- •1.Традиционные файловые системы
- •1.1.Подход, используемый в файловых системах
- •2.Системы с базами данных
- •2.1.База данных
- •2.2.Система управления базами данных ─ субд
- •2.3.Разработка базы данных смена парадигмы
- •3.Преимущества и недостатки субд
- •4.Модели данных
- •4.1.Объектные модели данных
- •4.2.Модели данных на основе записей
- •4.2.1 Иерархическая модель данных
- •4.2.2 Сетевая модель данных
- •4.2.3 Реляционная модель данных
- •4.2.4 Свойства отношений
- •4.2.5 Реляционная целостность
- •Целостность сущностей
- •Ссылочная целостность
- •Корпоративные ограничения целостности.
- •5.Функции субд
- •6.Компоненты субд
- •7.Системные каталоги
- •8.Инструкции sql
- •8.1.Имена
- •8.2.Имена таблиц
- •8.3.Имена столбцов
- •8.4.Типы данных
- •8.5.Константы
- •9.Инструкция select
- •9.1.Предложение select
- •9.2.Предложение from
- •9.3.Результаты запроса на выборку
- •9.4.Простые запросы
- •9.5.Вычисляемые столбцы
- •9.6.Выборка всех столбцов
- •9.7.Повторяющиеся строки
- •9.8.Отбор строк (предложение where)
- •9.8.1 Сравнение
- •9.8.2 Проверка на принадлежность значений (оператор between and)
- •9.8.3 Проверка на членство в множестве (оператор in)
- •9.8.4 Проверка на соответствие шаблону (оператор like)
- •10.Запросы с объединением таблиц
- •10.1.Производительность при обработке многотабличных запросов
- •11.Статистические (агрегатные) функции
- •12.Запросы с группировкой (предложение group by)
- •12.1.Условие отбора групп (предложение having)
- •13.Подчиненные запросы (подзапросы)
- •13.1.Условия отбора в подчиненном запросе
- •13.1.1 Проверка на существование (предикат exists)
- •13.1.2 Многократное сравнение (предикаты any и all)
- •Предикат any
- •Предикат all
- •13.1.3 Уровни вложенности запросов
- •14.Представления
- •14.1.Создание представлений
- •14.2.Как субд работает с представлениями
- •14.3.Преимущества представлений
- •14.4.Недостатки представлений
- •14.5.Обновление представлений
- •14.6.Контроль над обновлением представлений (предложение with check option)
- •15.Добавление новых данных
- •15.1.Однострочная инструкция insert
- •15.2.Добавление значений null
- •15.3.Добавление всех столбцов
- •15.4.Многострочная инструкция insert
- •16.Удаление существующих данных
- •16.1.Удаление всех строк
- •16.2.Инструкция delete с подчиненным запросом
- •17.Обновление существующих данных
- •17.1.Обновление всех строк
- •17.2.Инструкции update с подчиненным запросом
- •18.Условия целостности данных
- •18.1.Обязательное наличие данных
- •18.2.Условия на значения
- •18.3.Целостность таблиц (сущностей)
- •18.4.Проблемы, связанные со ссылочной целостностью
- •18.5.Правила удаления и обновления
- •18.6.Каскадные удаления
- •18.7.Ссылочные циклы
- •19.Язык определения данных
- •19.1.Создание базы данных
- •19.2.Создание таблиц (инструкция create table)
- •19.2.1 Определения столбцов
- •19.2.2 Определение первичного и внешнего ключей
- •19.2.3 Условия уникальности и ограничения на значения столбцов
- •19.3.Удаление таблицы (инструкция drop table)
- •19.4.Изменение определения таблицы (инструкция alter table)
- •19.4.1 Добавление и удаление столбца
- •19.4.2 Изменение первичных и внешних ключей
- •20.Псевдонимы таблиц (инструкции create / drop synonym)
- •21.Индексы (инструкции create/drop index)
- •22.Транзакции
- •22.1.Инструкции commit и rollback
- •22.2.Модель транзакции в стандарте ansi/iso
- •22.3.Журнал транзакций
- •22.4.Транзакции и работа в многопользовательском режиме
- •22.4.1 Проблема пропавшего обновления
- •22.4.2 Проблема промежуточных данных
- •22.4.3 Проблема несогласованных данных
- •22.4.4 Проблема строк – призраков
- •22.5.Параллельные транзакции
- •22.6.Блокировка
- •22.6.1 Уровни блокировки
- •22.6.2 Жесткая и нежесткая блокировки
- •22.6.3 Тупиковые ситуации
- •22.6.4 Явная блокировка
- •23.Принципы защиты данных, применяемые в sql
- •23.1.Пользователи
- •23.1.1 Аутентификация пользователей
- •23.2.Защищаемые объекты
- •23.3.Привилегии
- •23.3.1 Работа с привилегиями при помощи ролей
- •23.3.2 Роли, определяемые пользователями
- •23.3.3 Разрешение и запрещение ролей
- •23.3.4 Предоставление привилегий (инструкция grant)
- •23.3.5 Передача привилегий (предложение with grant option)
- •23.3.6 Отмена привилегий (инструкция revoke)
- •Инструкция revoke и право предоставления привилегий
- •24.Программирование сервера баз данныхoracle посредством pl/sql
- •24.1.Блоки
- •24.2.Комментарии
- •24.3.Объявления
- •24.3.1 Переменные и константы
- •24.3.2 Подтипы, определяемые пользователями
- •24.3.3 Составные типы, определяемые пользователями
- •Вложенные таблицы
- •Изменяемые массивы
- •24.3.4 Атрибуты
- •24.3.5 Особые замечания относительно вложенных таблиц и изменяемых массивов
- •Инициализация вложенных таблиц и изменяемых массивов
- •Использование методов сборных конструкций со вложенными таблицами и с изменяемыми массивами
- •24.3.6 Курсоры, курсорные типы и курсорные переменные
- •Курсорные типы и переменные
- •24.4.Функциональные возможности программ
- •24.4.1 Управление выполнением программ
- •Условное управление
- •Итерационное управление
- •24.4.2 Взаимодействие с базами данных
- •Стандартный dml
- •Работа с курсорами
- •Работа с курсорными переменными
- •24.4.3 Обработка исключительных ситуаций
- •24.5.Типы программ pl/sql
- •24.5.1 Анонимные блоки
- •24.5.2 Хранимые процедуры и функции
- •Создание процедур
- •Создание функций
- •Вызов процедур и функций
- •Управление блоками в sql*Plus
- •24.5.3 Модули
- •Использование объектов модуля
- •24.5.4 Триггеры баз данных
- •24.6.Служебные модули oracle
- •24.6.1 Модуль dbms_output
- •24.6.2 Динамический sql
- •Модуль dbms_sql
- •Использование dbms_sql
- •24.6.3 Файловый ввод/вывод (модуль utl_file)
- •Безопасность
- •Безопасность базы данных
- •Безопасность операционной системы
- •Исключительные ситуации, устанавливаемые в utl_file
- •Открытие и закрытие файлов
- •Файловый вывод
- •Файловый ввод
- •24.6.4 Взаимодействие между соединениями (модуль dbms_pipe)
- •Посылка сообщений
- •Получение сообщений
- •Создание программных каналов и управление ими
- •Программные каналы
- •Общие и частные каналы
- •Привилегии и безопастность
- •Установление протокола связи
- •Форматирование сообщений
- •Адресация данных
- •25.Создание приложений баз данных средствами odbc
- •25.1.Архитектура odbc
- •25.2.Коды возврата
- •25.3.Основной алгоритм программ odbc
- •25.4.Функции инициализации и завершения
- •25.5.Выполнение операторов
- •25.5.1 Функции управления каталогом
- •25.5.2 Непосредственное выполнение
- •25.5.3 Подготавливаемое выполнение
- •Использование параметров при выполнении.
- •25.6.Выборка результатов.
- •25.6.1 Выборка информации о результирующем множестве
- •25.6.2 Базовые функции выборки данных
- •25.7. Подробный алгоритм использования odbc в прикладных программах
25.6.2 Базовые функции выборки данных
Как только закончена выборка информации о результирующем множестве, можно приступать к выборке собственно результирующего множества. В ODBC существует две функции базового уровня для выборки результатов: SQLBindCol() и SQLFetch(). Функция SQLBindCol() определяет область хранения данных результирующего множества, а SQLFetch() осуществляет выборку данных в области хранения. Алгоритм программы, использующей эти функции для возвращения данных из всех строк результирующего множества, предполагает выполнение следующих шагов:
1. Вызов SQLBindCol() один раз для каждого столбца, который должен быть возвращен из результирующего множества,
2. Вызов SQLFetch() для перемещения курсора на следующую строку и возврата данных из связанных столбцов,
3. Повторение шага 2 до тех пор пока SQLFetch() не возвратит SQL_NO_DATA_FOUND. Это указывает на то, что был достигнут конец результирующего множества. Если результирующее множество является пустым, то SQL_NO_DATA_FOUND будет возвращен сразу же при первом вызове SQLFetch().
Функция SQLFetch() извлекает строку данных из результирующего множества для выполненного SQL – оператора. Драйвер возвращает данные для всех столбцов, которые были связаны для предварительного хранения данных с помощью функции SQLBindCol(). Синтаксис функции SQLFetch():
RETCODE SQLFetch (hstmt)
Здесь HSTMT – идентификатор выполненного оператора.
Если необходимо определить область хранения данных результирующего множества, которые должны быть извлечены, то вызывается функция SQLBindCol(). Каждый столбец, который требуется выбрать, связывается с помощью отдельного вызова функции.
Функция SQLBindCol() назначает область хранения в памяти и тип данных для столбца результирующего множества. Она определяет:
• Буфер хранения для получения содержимого столбца данных в результирующем множестве,
• Длину указанного буфера хранения,
• Область памяти для хранения длины столбца выборки
• Преобразование типа данных.
Синтаксис данной функции имеет следующий вид:
RETCODE SQLBindCol (hstmt, icol, fcType, rgbValue, cbValueMax,
pcbValue)
Таблица 34 Параметры функции SQLBindCol()
Тип |
Аргумент |
Использование |
Описание |
1 |
2 |
3 |
4 |
HSTMT |
hstmt |
Вход |
Идентификатор оператора |
UWORD |
icol |
Вход |
Номер столбца результирующего множества, упорядоченный слева направо, начиная с 1 |
SWORD |
fcType |
Вход |
С – тип данных столбца результирующего множества. Некоторые из возможных значений: SQL_C_BINARY, SQL_C_BIT, SQL_C_CHAR, SQL_C_DEFAULT, SQL_C_FLOAT, SQL_C_SLONG, SQL_C_SSHORT, SQL_C_ULONG, SQL_C_USHORT. SQL_C_DEFAULT определяет, что данные должны быть переданы в С – тип по умолчанию. |
PTR |
rgbValue |
Вход |
Указатель области хранения данных. Если является нулевым указателем, то драйвер “отвязывает” столбец. Для “отвязывания” всех столбцов программа вызывает SQLFreeStmt() с опцией SQL_UNBIND. |
SDWORD |
cbValueMax |
Вход |
Максимальная длина буфера rgbValue. Для символьных данных буфер должен предусматривать место для нуль – окончания строки. |
|
|
|
|
|
|
Продолжение таблицы 34 |
|
1 |
2 |
3 |
4 |
SDWORD* |
pcbValue |
Вход |
SQL_NULL_DATA или размер возвращаемой в rgbValue строки. Если размер строки не может быть определен, то по адресу pcbValue размещается SQL_NO_TOTAL. |
SDWORD* |
pcbValue |
Вход |
Если размер строки не может быть определен, или больше cbValueMax, то данные в rgbValue усекаются до размера, определенного в cbValueMax и имеют нулевое окончание, благодаря драйверу. Для двоичных данных выполняется то же самое с поправкой на нуль – окончание. Для всех других типов данных значение cbValueMax игнорируется и драйвер считает, что размер rgbValue равен размеру С – типа данных, определенного в fcType. |
Приведем пример программы, использующей средства ODBC:
#include <sql.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX_STMT_LEN 100
main()
{
HENV henv; /*идентификатор среды*/
HDBC hdbc; /*идентификатор соединения*/
HSTMT hstmt; /*идентификатор оператора*/
RETCODE rc; /*код возврата*/
UCHAR selstmt [MAX_STMT_LEN] /*строка оператора*/
UCHAR address [30];
UCHAR tel_no [15];
UCHAR pos [25];
SDWORD address_len, tel_no_len, pos_len;
SQLAllocEnv (&henv);
SQLAllocConnect (henv, &hdbc);
rc=SQLConnect (hdbc, “drhome”, SQL_NTS, “student”, SQL_NTS, “student”,
SQL_NTS);
if (rc = = SQL_SUCCESS || rc = = SQL_SUCCESS_WITH_INFO)
{
SQLAllocStmt (hdbc,&hstmt);
lstrcpy (selstmt, “select address, tel_no, position from staff
where lname = ‘Иванов’ and fname = ‘Иван’ ”);
if (SQLExecDirect (hstmt, selstmt, SQL_NTS) != SQL_SUCCESS)
exit (-1);
SQLBindCol (hstmt, 1, SQL_C_CHAR, address,
(SDWORD)sizeof(address), address_len);
SQLBindCol (hstmt, 2, SQL_C_CHAR, tel_no,
(SDWORD)sizeof(tel_no), tel_no_len);
SQLBindCol (hstmt, 3, SQL_C_CHAR, pos,
(SDWORD)sizeof(pos), pos_len);
while(RETCODE_IS_SUCCESSFULL(rc))
{
rc=SQLFetch (hstmt);
if (RETCODE_IS_SUCCESSFULL(rc))
{
/*…вывод возвращенных строк…*/
}
}
SQLFreeStmt (hstmt, SQL_DROP);
SQLDisconnect (hdbc);
}
SQLFreeConnect (hdbc);
SQLFreeEnv(henv);
}
