Первая информация, которая может понадобится прикладной программе для соединения с неизвестным источником данных – это информация о таблицах. ODBC – функция SQLTables возвращает список имен таблиц, которые содержит указанный источник данных. Используя идентификатор оператора, драйвер возвращает информацию в виде результирующего множества. Синтаксис SQLTables имеет вид:
RETCODE SQLTables (hstmt, szTableQualifier, sbTableQualifier, szTableOwner, sbTableOwner, szTableName, sbTableName, szTableType, sbTableType)
Таблица 9 Описание параметров SQLTables
Тип | Аргумент | Использование | Описание |
HSTMT | hstmt | Вход | Идентификатор оператора |
UCHAR* | szTableQualifier | Вход | Имя квалификатора или “”, означающая, что таблицы не имеют квалификаторов |
SWORD | sbTableQualifier | Вход | Длина szTableQualifier или SQL_NTS |
UCHAR* | szTableOwner | Вход | Образец строки поиска для имен собственников или “”, означающая что данная база не поддерживает имен собственников. |
SWORD | sbTableOwner | Вход | Длина szTableOwner или SQL_NTS |
UCHAR* | szTableName | Вход | Образец строки поиска для имен таблиц. |
SWORD | sbTableName | Вход | Длина szTableName или SQL_NTS |
UCHAR* | szTableType | Вход | Список типов таблиц для выбора. |
SWORD | sbTableType | Вход | Длина szTableType или SQL_NTS |
В образцах строк для поиска возможно использование символов-заменителей, так ‘%’ заменяет любую последовательность символов, а ‘-‘ – произвольный одиночный символ. Список типов таблиц для выбора может содержать следующие типы таблиц: ‘TABLE’,’VIEW’, ‘SYSTEM TABLE’, ‘ALIAS’ и некоторые таблицы. Представления (VIEW) вообще-то не являются таблицами БД, но зачастую носят имя “виртуальных таблиц” в силу похожести использования для операторов извлечения. Если символ ‘%’ используется в каком-то из аргументов функции в качестве шаблона выбора, а все остальные аргументы шаблонов – пустые строки, то можно получить список всех квалификаторов, владельцев или таблиц для выбранного источника. При использовании такого способа вызова все столбцы в результирующем множестве, кроме одного, устанавливаются в NULL. Например следующий вызов возвратит список всех таблиц и представлений:
rc=SQLTables (hstmt, “”, SQL_NTS, “”,SQL_NTS, “%”, SQL_NTS, “’TABLE’, ‘VIEW’”, SQL_NTS).
Результирующее множество функции SQLTables одно и тоже для любого её вызова и представлено в таблице 10.
Таблица 10 Результирующее множество SQLTables
Имя столбца | Тип данных | Объяснение |
TABLE_QUALIFIER | VARCHAR(128) | Идентификатор квалификатора |
TABLE_OWNER | VARCHAR(128) | Идентификатор собственника |
TABLE_NAME | VARCHAR(128) | Идентификатор таблицы |
TABLE_TYPE | VARCHAR(128) | Идентификатор типа таблицы (“TABLE”, “VIEW” и др. строки) |
REMARKS | VARCHAR(256) | Описание таблицы |
Как только информация о таблицах получена, зачастую бывает необходимо получить информацию о столбцах интересующей таблицы. Чтобы выбрать эту информацию, программа должна вызвать SQLColumns(). При вызове драйвер, используя идентификатор оператора, возвращает эту информацию в результирующем множестве:
Таблица 11 Результирующее множество SQLColumns()
Имя столбца | Тип данных | Описание |
TABLE_QUALIFIER | VARCHAR(128) | Идентификатор квалификатора |
TABLE_OWNER | VARCHAR(128) | Идентификатор собственника |
TABLE_NAME | VARCHAR(128) | Название таблицы |
COLUMN_NAME | VARCHAR(128) | Название столбца |
DATA_TYPE | Smallint | SQL – тип данных |
TYPE_NAME | VARCHAR(128) | Имя типа данных в зависимости от источника |
PRECISION | Integer | Точность |
LENGTH | Integer | Длина столбца |
SCALE | Smallint | Масштаб |
NULLABLE | Smallint | SQL_NO_NULLS SQL_NULLABLE SQL_NULLABLE_UNKNOWN |
REMARKS | VARCHAR(254) | Описание таблицы |
Столбцы DATA_TYPE и TYPE_NAME определяют тип данных по разному. DATA_TYPE является ODBC SQL – типом данных, а TYPE_NAME является специфическим типом данных источника. Один и тот же ODBC SQL –тип может иметь разные типы данных для каждого источника. Столбцы PRECISION и SCALE можно использовать в других функциях (например в функции SQLBindParameter). PRECISION определяет общее число цифр или максимальную длину, а SCALE определяет количество цифр справа от десятичной точки и используется для числовых столбцов.
Синтаксис же функции следующий:
RETCODE SQLColumns (hstmt, szTableQualifier, sbTableQualifier, szTableOwner, sbTableOwner, szTableName, sbTableName, szColumnName, sbColumnName)
Таблица 12 Описание параметров SQLColumns
Тип | Аргумент | Использование | Описание |
HSTMT | hstmt | Вход | Идентификатор оператора |
UCHAR* | szTableQualifier | Вход | Квалификатор таблиц, “” означает, сто таблицы источника не поддерживают квалификаторов |
SWORD | sbTableQualifier | Вход | Длина szTableQualifier |
UCHAR* | szTableOwner | Вход | Образец строки поиска для имен собственников |
SWORD | sbTableOwner | Вход | Длина szTableOwner |
UCHAR* | szTableName | Вход | Образец строки поиска для имен таблиц |
SWORD | sbTableName | Вход | Длина szTableName |
UCHAR* | szColumnName | Вход | Образец строки поиска для имен столбцов |
SWORD | sbColumnName | Вход | Длина szColumnName |
Первые семь параметров общие для большинства функций работы с системным каталогом. Оставшиеся два специфичны для данной функции. Для приложений может оказаться оправданным возвращение всех таблиц баз данных посредством SQLTables, однако это не совсем справедливо по отношению к столбцам. В больших базах список всех столбцов по всем таблицам очень большой. Поэтому для прикладной программы важно тщательное использование параметров, ограничивающих результирующее множество.
Непосредственное выполнение
Непосредственное выполнение целесообразно использовать в следующих случаях:
● SQL – операторы, которые должны быть выполнены, выполняются только один раз,
● Не требуется информация о результирующем множестве до выполнения оператора.
Непосредственное выполнение реализуется с помощью функции SQLExecDirect() и представляет наиболее быстрый способ запуска SQL – оператора при одноразовом выполнении.
Синтаксис функции имеет вид:
RETCODE SQLExecDirect( hstmt, szSqlStr, sbSqlStr)
Таблица 13 Описание параметров SQLExecDirect()
Тип | Аргумент | Использование | Описание |
HSTMT | hstmt | Вход | Идентификатор оператора |
UCHAR* | szSqlStr | Вход | SQL – оператор для выполнения |
SDWORD | sbSqlStr | Вход | Длина szSqlStr или SQL_NTS |
Например следующий вызов функции непосредственного выполнения будет возвращать все строки из таблицы Staff:
rc=SQLExecDirect (hstmt, “select * from staff”, SQL_NTS).
Подготавливаемое выполнение
Данный способ выполнения оператора предпочтителен в случае, если оператор предполагается выполнять несколько раз и требуется предварительная информация о результирующем множестве. Для подготавливаемого выполнения необходимы две функции: SQLPrepare() и SQLExecute().
SQLPrepare() подготавливает SQL – строку для выполнения. Синтаксис её ничем не отличается от синтаксиса SQLExecDirect(). Синтаксис SQLExecute() следующий:
RETCODE SQLExecute (hsmt)
где hsmt – предварительно назначенный идентификатор оператора.
SQLPrepare() отличается от SQLExecDirect() тем, что при вызове SQLPrepare() оператор на самом деле не выполняется. Вместо этого определяется путь доступа к данным и информация о результирующем множестве становится доступной для использования. Так функции SQLNumResultCols() и SQLRowCount() при вызове возвращают количество столбцов и строк результирующего множества. Так как план выполнения оператора после его подготовки известен, то его выполнение может выполняться несколько быстрее, чем при использовании SQLExecDirect(). Кроме того, каждый вызов SQLExecute() передает базе данных только идентификатор, а не строку запроса, что может несколько снизить сетевой трафик.