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

1 ... 149 150 151 [ 152 ] 153 154 155 ... 264


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

Инструкция prepare может быть использована для подготовки практически любой исполняемой инструкции DML или DDL, включая инсфукцию select. Инструкции SQL, которые являются директивами препроцессора (например, инсфукции whenever или declare cursor), конечно, не могут быть подготовлены, так как это не исполняемые инструкции.

Инструкция EXECUTE

Инсфукция execute, синтаксическая диафамма которой изображена на рис. ] 8 6, применяется только в динамическом SQL. Она дает СУБД команду выполнить инструкцию, подготовленную ранее посредством инструкции prepare. С помощью инструкции execute можно выполнить любую подготовленную инструкцию, за одним исключением. Как и инсфукция execute immediate, инструкция execute не может использоваться для выполнения инсфукции select, поскольку не имеет механизма обработки результатов запроса.

I-EXECUTE имя инструкции USING

6азовая пврвмвнная

DESCRIPTOR имя двскриптора

Рис. 18.6. Синтаксическая диаграмма инструкции EXECUTE

Если динамическая инсфукция, которая должна быть выполнена, содержит один или несколько маркеров парамефов, инсфукция execute должна передать в СУБД значения всех этих параметров. Это можно сделать двумя различными способами, описанными в двух последующих парафафах В стандарте SQL2 поддерживаются оба способа

Инструкция EXECUTE с базовыми переменными

Самый простой способ передать значения парамефОв - это задать список базовых переменных в предложении using. Инструкция execute подставляет соответствующие значения базовых переменных вместо маркеров параметров в подготовленном тексте инструкции. Таким образом, эти базовые переменные являются дтя Динамически выполняемой инсфукции входными базовыми переменными. Такой метод применяется в программе, представленной на рис. 18 4.

Число базовых переменных в предложении using должно соогветствовать числу маркеров парамефов в динамической инструкции, а типы переменных должны бьяь совместимыми с типами данных соответствующих парамефов Каждая базовая переменная может иметь согтутствующую переменную-индикатор Если во время выполнения ннсфукции execute какая-нибудь переменная-индикатор содержит офицательное значение, то соответствующему маркеру параметра присваивается значение null.



Инструкция EXECUTE, использующая область SQLDA

BTopoff способ передачи параметров заключается в применении специальной структуры, называемой областью данных SQL или сокращенно sqlda (SQL Data Area) Эта область используется для передачи параметров, когда во время написания профаммы неизвестны ни число передаваемых парамефов, ни их типы данных Пусть, например, вам необходимо так модифицировать профамму обновления таблиц, представленную на рис 18 4, чтобы пользователь получил возможность обновлять несколько столбцов Можно легко модифицировать профамму, чтобы она формировала инсфукцию Update с переменным числом обновляемых столбцов, но возникает проблема со списком базовых переменных в инсфукции execute он должен быть заменен списком переменной длины Область sqlda как раз обеспечивает способ задания такого списка

На рис 18 7 изображен формат области sqlda, используемой во всех СУБД компании IBM, включая DB2, которая определяет стандарт де-факто на динамический SQL В большинстве других СУБД используется аналогичный формат или очень близкий к нему В стандарте SQL2 описана похожая структура, которая называется область дескриптора SQL В ней хранится та же самая информация, и обе Сфуктуры играют одинаковую роль в динамической обработке инструкций Однако детали записи информации в область дескриптора и последующего извлечения этой информации весьма существенно различаются На практике предпочтение отдается структуре sqlda, поскольку она появилась задолго до стандарта SQL2

Область sqlda представляет собой структуру данных переменной длины, состоящую из двух отдельных частей

Постоянная часть располагается в начале области Ее поля идентифицируют Сфуктуру как область sqlda и задают размер данной конкретной области

Переменная часть представляет собой массив из одной или нескольких сфуктур sqlvar Когда область sqlda используется для передачи парамефов в инсфукцию execute, то каждому парамефу соответствует отдельная структура sqlvar

struct sqlda (

unsigned char sqldaid[8]; long sqldabc;

short sqln;

short sqld,

struct sqlvar {

short sqltype;

short sqllen,

unsigned char *sqldata;

short *sqlind;

struct sqlname {

short length;

unsigned char data[30]

}sqlname, }sqlvar[1];

Рис 18 7 Область данных SQL (SQLDAj в СУБД компании IBM

Поля структуры sqlvar описывают данные, переданные инсфукции execute в виде значений парамефов

Поле sqltype содержит целочисленный код типа данных, который определяет тип передаваемого парамефа Например, в DB2 код 500 соответствует двухбайтовому целому числу, код 496 - четырехбайтовому целому числу, а код 448 - символьной сфоке переменной длины (см таблицу 18 1)



Поле sqllen задает длину передаваемых данных Оно будет содержать значение 2 для двухбайтового целого числа и 4 дпя четырехбайтового целого числа Когда в качестве параметра передается символьная строка, поле sqllen содержит число символов в строке

Поле sqldata является указателем на область данньа внутри профаммы, которая содержит значение параметра СУБД использует этот указатель, чтобы найти требуемые данные при выполнении динамической инсфукции SQL Поля sql-type и sqllen информируют СУБД о типе этих данных и их длине

Поле sqlind является указателем на двухбайтовое целое число, которое используется в качестве переменной-индикатора дпя данного парамефа СУБД проверяет переменную-индикатор, чтобы определить, не передается ли значение null Если переменная-индикатор для парамефа отсутствует, то в поле sqlind должно быть указано значение нуль

Другие поля в сфуктуре sqlvar не используются для передачи парамефов посредством инструкции execute Они служат для извлечения информации из базы данных, этот процесс рассмафивается ниже в настоящей главе

На рис 18 8 изображена профамма с динамическим SQL, в которой входные парамефы задаются с помощью области sqlda Программа обновляет таблицу salesreps, и пользователь может указать, какие столбцы будут обновляться Затем профамма выполняет цикл, в котором запращиваег у пользователя идентификатор служащего и новые значения для обновляемых столбцов Если в ответ на просьбу ввести новое значение пользователь вводит звездочку (*), профамма присваивает соответствующему столбцу значение null

mam ()

Данная программа обновляет указанные пользователем столбцы таблицы SALESREPS Вначале она запрашивает у пользователя имена столбцов, которые будут обновляться, а затем в цикле запрашивает идентификатор служащего и новые значения для выбранных столбцов

#defme COLCNT б

exec sql include sqlca, exec sql include sqlda, exec sql begin declare section,

char stmtbuf[2001], exec sql end declare section,

/* в таблице SALESREPS шесть столбцов */

/* текст инструкции SQL */

struct {

char name[31], /*

short typecode, /*

short buflen, /*

char selected /*

) columns[] = { NAME , 449,

REP OFFICE , 496,

MANAGER , 4 96,

HIRE DATE , 448,

QUOTA , 4 80,

SALES , 480,

имя данного столбца */ код типа данных столбца длина буфера столбца * флаг выбора (у/п) */ 16, п,

4, п,

12, п, п , п ),

**с188. Примвнвю инсгрущи ЩСиТЕ н обпасгиЗОШ/*



1 ... 149 150 151 [ 152 ] 153 154 155 ... 264

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