Программирование >>  Sql: полное руководство 

1 ... 170 171 172 [ 173 ] 174 175 176 ... 264


long stmtHdl, /* Входной: дескриптор инструкции */

char *stmtText, /* Входной: текст инструкции */

short textLen) /* Входной: длина текста инструкции */

/* Выполнение ранее подготовленной инструкции SQL */ short SQLExecute(

long stmtHdl) /* Входной: дескриптор инструкции /

/* Связывает параметр инструкции SQL

с программным буфером */ short SQLBindParam(

long StmtHdl, /* Входной: дескриптор инструкции */

short parraNr, /* Входной: номер параметра (1, 2, 3...) */

short valType, /* Входной: код типа параметра в языке С */

short parmType, /* Входной: код типа параметра в SQL */

short colSize, /* Входной: размер столбца */

short decDigits, /* Входной: количество десятичных цифр */

void *value, /* Входной: указатель на буфер для

значения параметра */ long *lenlnd) /* Входной: указатель на буфер, в который

помещается реальная длина параметра или индикатор значения NULL */

/* Возвращает указатель на буфер или специальный тег параметра,

для которого требуется передать значение */ short SQLPararaData(

long StmtHdl, /* Входной: дескриптор инструкции с динамическими

параметрами */

void *prmTag) /* Выходной: возвращаемый указатель буфера

или тег параметра */

/* Передача значения очередному динамическому параметру

выполняемой инструкции */ short SQLPutData(

long StmtHdl, /* Входной: дескриптор инструкции с динамическими

параметрами */

void *prmData, /* Входной: буфер, содержащий значение параметра */ short prmLenlna) /* Входной: длина параметра или индикатор

значения NULL */

Рис. 19.14. Функции си, предназначенные для обработки инструкций SQL

Для непосредственного выполнения инструкции приложение вызывает функцию SQLExecDirect О, передавая ей текст инструкции в одном из параметров. СУБД обрабатывает инструкцию и возвращает код ее заверщения. Этот процесс был проиллюстрирован на рис 19.11. Он соответствует инструкции EXECUTE immediate динамического SQL, описанной в предыдущей главе.

Для двухэтапного выполнения инструкции SQL приложение сначала вызывает функцию SQLPrepare (), которой также передается текст инструкции. В ответ СУБД анализирует инструкцию, генерирует план ее выполнения и сохраняет этот план. Немедленного выполнения инструкции не происходит - для этого служат отдельные вызовы функции SQLExecute О, которые могут следовать за функцией SQLPre-Раге (). Описанный процесс в точности соответствует двухэтапной схеме выполнения инструкции в динамическом SQL с помощью инструкций prepare и EXECUTE,

описанных в предыдущей главе. Он лучше всего подходит для тех инструкций SQL, тоторые выполняются программой многократно, поскольку позволяет сэкономить время на их анализе и оптимизации, выполняемых единожды в ответ на вызов функции SQLPrepare о .



Выполнение инструкций, имеющих лорометры

Во многих случаях одна и та же инструкция SQL выполняется многократно с разными значениями параметров Например, так бывает при добавлении заказов в базу данных, когда для каждого нового заказа выполняется она и та же инструкция INSERT, но каждый раз в ней указываются иные идентификаторы клиента, товара и производителя и иное количество заказанного товара Как и в случае динамического SQL, такие инструкции могут быть выполнены гораздо эффективнее, если определить их переменные части в виде входных параметров В текст инструкции, передаваемый функции SQLPrepare (), вставляются маркеры параметров (вопросительные знаки) указывающие, куда должны помещаться значения параметров, которые позднее, при выполнении инструкции, будут отдельно предоставлены СУБД.

Простейщим способом задания параметров инструкции SQL является вызов функции sQLBmdParam (). Каждый вызов этой функции устанавливает связь между одним из маркеров параметров (идентифицируемым по его номеру) и профаммной переменной (идентифицируемой по адресу в памяти). Дополнительно может указываться еще одна, целочисленная переменная, которая будет содержать длину входного парамефа (если он имеет переменную длину). В случае, когда парамеф представляет собой Сфоку, оканчивающуюся нулевым символом (такие сфоки широко используются в профаммах на языке С), функции SQLBmdParamO может быть передана специальная константа SQL NTS, указывающая, что функция CLI должна сама определить длину сфоки. Другая константа, sql null data, указывает, что значением входного парамефа является NULL Если инсфукция используетфи маркера парамефов, функция SQLBmdParamO должна быть вызвана фижды: по одному разу для каждого входного параметра

После того как связь между профаммЫыми переменньгми (более точно, между адресами профаммных буферов, предназначенных для хранения данных) и входными параметрами инсфукции SQL установлена, можно выполнить эту инсфукцию с помошью функции SQLExecute (). Для изменения значений парамефов достаточно только перед очередным вызовом функции SQLExecute () поместить в связанные буферы новые данные. При желании любой парамеф можно связать с другим буфером, вызвав функцию SQLBmdParamO еще раз. На рис. 19.15 приведена программа, выполняющая инсфукцию SQL с двумя входными парамефами. Профамма в циое запрашивает у пользователя идентификатор клиента и его новый лимит кредита и заносит эту информацию в таблицу CUSTOMERS с помощью инсфукции UPDATE.

/* Программа

заносит в базу данных

введенный

пользователем лимит кредита клиента */

#include <sqlcli.h> /* файл с

объявлениями структур и функций CLI */

mam (J 1

SQLrlENV

env hdl;

/* дескриптор среды SQL */

SQLHDBC

conn hdl;

/* дескриптор сеанса подключения */

SQLHSTMT

strat hdl;

/* дескриптор инструкции */

SQLRETURN

status;

/* код, возвращаемый функцией CLI */

char

*svr name = demo ;

/* имя сервера */

char

*user name = joe ;

/* имя пользователя для подключения */

char

*user pswd = xyz ;

/* пароль для подключения */

char

arat buf[31];

/* введенная пользователем сумма */

amt md = SQL NTS;

/* переменная-индикатор

(строка, заканчивающаяся

нулевым символом */

Рис. 19.15. Программа, выполняющая инструкцию SQL со входными параметрами

с помощью си



char \ cust buf [31 ] ; введенный пользователем

идентификатор клиента /

int cust ind = SQL NTS, /* переменная-индикатор

(строка, заканчивающаяся нулевым символом) */

char stmt buf[128]; /* буфер для инструкции SQL */

/* Выделяем память для среды SQL, сеанса подключения

и инструкции и получаем их дескрипторы */ SQLAllocHandle(SQL HANDLE ENV, SQL NULL HANDLE, Senv hdl); SQLAllocHandle(SQL HANDLE DBC, env hdl, Sconn hdl); SQLAllocHandle(SQL HANDLE STMT, conn hdl, Sstmt hdl);

/* Подключаемся к базе данных, указав имя сервера, имя пользователя и пароль.

Спецификатор SQL NTS говорит о том, что мы передаем строку переменной длины, оканчивающуюся нулевым символом. */ SQLConnect (conn hdl, svr narae, SQL NTS, user narae, SQL NTS, user pswd, SQL NTS);

/* Подготавливаем инструкцию UPDATE с маркерами параметров */ strcpy(strat buf, update customers set credit limit = ? ); Strcat(stmt buf, where cust num = ? ); SQLPrepare (st!nt hdl, st!nt buf, SQL NTS) ;

/* Связываем параметры с программными буферами */ SQLBindParam(stmt hdl, 1, SQL C CHAR, SQL DECIMAL,

9, 2, Samt buf, Samt ind); SQLBindParam(stmt hdl, 2, SQL C CHAR, SQL INTEGER,

0, 0, &cust buf, Scust ind);

/* Цикл обработки вводимых пользователем значений */ for ( ; ; )

/* Запрашиваем у пользователя идентификатор клиента

и его лимит кредита */ printf( Введите идентификатор клиента: ); gets(cust buf); if (strlen(cust buf) == 0) break;

prmtf ( Введите новый лимит кредита: ); gets(amt buf);

/* Выполняем инструкцию с параметрами */ status = SQLExecute(stmt hdl>; if (status)

printf( Ошибка при обновлении.\n ); else

printf( Обновление выполнено успешно.\n );

/* Завершаем транзакцию */

SQLEndTran(SQL HANDLE ENV, env hdl, SQL COMMIT);

/* Отключаемся от сервера, освобождаем дескрипторы

и выходим из программы */ SQLDisconnect(conn hdl);

SQLFreeHandle(SQL HANDLE STMT, stmt hdl); SQLFreeHandle(SQL HANDLE DBC, conn hdl); SQLFreeHandle(SQL HANDLE ENV, env hdl); exit (0);

Phc. 19.15. Программа, выполняющая инструкцию SQbco входными гюрсщрами с помощью си -ж* ,



1 ... 170 171 172 [ 173 ] 174 175 176 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика