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

1 ... 155 156 157 [ 158 ] 159 160 161 ... 264


SQL/DS. Для создания пустого модуля доступа в SQL/DS имеется инструкция create program, в которой задается имя длиной до восьми символов:

CREATE PROGRAM имя модуля

Удалить модуль доступа из базы данных можно с помощью инструкции drop program:

QgOP PROGRAM иыя модуля

Обратите внимание: хотя инструкции называются create program и drop program, они совершают операции над модулями доступа. Часто, однако, набор скомпилированных инструкций, хранимый в модуле доступа, используется одной-един-ственной программой.

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

execute, declare cursor, open, fetch И close. ОнИ изображены на рИС. 18.16.

Препроцессор SQL/DS поддерживает использование этих инструкций в профаммах, написанных на языке ассемблера для компьютеров IBM S/370.

[-PREPARE FROM 6эзовэя пвременная со строкой и,

1-SETTING базовая переменная с и0ентификатсром инструкции IN 6азовая переменная с именем модуля -

j- DROP STATEMENT спецификация идентификатора инструкции--

I- DESCRIBE спецификация идентификатора инструкции INTO имяструктуры -

[- EXECUTE спецификация идентификатора инструкции

I- USING DESCRIPTOR имя Оескриптора

I-DECLARE базовая перэменная с именем на6ора записвй CURSOR FOR спецификация идентификатора инструкции

I- OPEN 6азовая переменная с именемна6ора записей -

USING DESCRIPTOR имя дескриптора -FETCH 6азовая переменная с именем на6ора записей USING DESCRIPTOR имя Оескриптора -

CLOSE 6азовая переменнаяс именемна6ора записей -

спецификация идентификатора инструкции

зовая перемвнная с идентификатором инструкции IN

-6азоеая переменная с идентификатором попьзовател1

6азоеая переменная с именем модуля

c. 18.16. Расширенные динамические инструкции SQL в СУБД SQL/DS



Чтобы скомпилировать строку инструкции SQL и сохранить скомпилированную инструкцию в модуле доступа, профамма должна воспользоваться расширенной инсфукцией prepare. СУБД SQL/DS присваивает скомпилированной инсфукциц уникальный идентификатор (32-разрядное число) и возвращает этот идентификатор в базовую переменную профаммы. Все остальные расширенные динамические инструк1ши SQL ссылаются на скомпилированную инсфукцию с помошью ее идентификатора. Отдельная инсфукция может быть удалена из модуля доступа посредством инсфукции drop statement.

Для вьшолнения хранимой инсфукции профамма использует расширенную ин-сфукцию execute, например:

execute .stmt id in .module name using descriptor : pabm da

Профамма передает имя модуля доступа и идентификатор инсфукции в двух базовых переменных (:module name и :STMt id). С помошью области sqlda (:parm da), как рассмафивалось ранее в настояшей главе, программа передает также парамефы для динамической инсфукции. Расширенная динамическая инсфукция execute, как и ее стандартная версия, не годится для вьшолнения запросов на выборку.

Для вьшолнения хранимого запроса профамма использует расширенную инструкцию declare cursor, чтобы связать имя набора записей с запросом, например:

declare :CURS NAME cursor for :stmt id in : module name

Обратите внимание на то, что имя набора записей не записано в инструкции declare cursor, а передается как символьная сфока в базовой переменной (:curs name) Аналогично этому запрос, связанный с набором записей, ни записывается непосредственно в инструкцию declare cursor (как в статическом SQL), ни задается именем инструкции (как в динамическом SQL). Вместо этого с помошью базовых переменных в СУБД передается имя модуля доступа (;module name) и идентификатор инсфукции (:stmt id). Таким образом, расширенная инсфукция declare cursor обеспечивает динамическую связь между именем набора записей и запросом.

В расширенной инсфукции describe базовые переменные также используются для того, чтобы задать имя модуля доступа и идентификатор инсфукции, которая должна быть описана в области sqlda:

describe :STMT ID in :module name into :query DA

Расширенные инструкции open, fetch и close аналогичны своим двойникам в динамическом SQL. Однако имя набора записей не записывается непосредственно в инструкцию; вместо этого имя набора записей, который должен быть открыт, извлечен или закрыт, передается в базовой переменной, как показано ниже:

open :curs name using descriptor :parm da fetch :curs name using descriptor .query DA close :curs name

Это дает возможность использовать один набор инсфукций open, fetch и close в разное время для разных запросов, что делает профамму с расширенным динамическим SQL более гибкой.

Описанные возможности значительно повышают гибкость и производительность динамического SQL. Однако эта разновидность SQL используется только в SQL/D



и не поддерживается в DB2, основной СУБД компании IBM. В каком-то смысле создатели SQL/DS предвосхитили разработку более формализованного механизма именованных хранимых процедур, впервые появившихся в Sybase и SQL Server. Сегодня поддержка хранимых процедур осуществляется в большинстве ведущих СУБД, включая последние версии DB2, считающейся сегодня наследницей SQL/DS.

Динамический SQL в Oracle *

СУБД Oracle появилась на рынке раньше, чем DB2, и ее динамический SQL базировался на прототипе System/R компании IBM. Поэтому динамический SQL в Oracle несколько отличается от стандарта SQL, принятого компанией IBM. Хотя Oracle и DB2 в основном совместимы, Oracle отличается от DB2 способом использования маркеров параметров и области sqlda, форматом этой области и особенностями преобразования типов данных. Различия между Oracle и DB2 сходны с теми, которые характерны по отношению к DB2 и для большинства других СУБД. Поэтому будет полезно кратко рассмотреть применяемый в Oracle динамический SQL и его отличия от динамического SQL в DB2.

Именованные параметры

Вспомним, что DB2 не допускает применения ссылок на базовые переменные в динамически подготавливаемых инструкциях. Вместо этого параметры в инструкциях идентифицируются знаками вопроса (маркерами параметров), а значения параметров задаются в инструкции execute или open. Oracle же позволяет задавать параметры в динамически подготавливаемых инструкциях с использованием синтаксиса базовых переменных. Например, следующая последовательность встроенных инструкций SQL является в Oracle допустимой:

exec sql begin declare section;

char stmtbuf[1001];

int employee nurnber; *

exec sql end declare section;

strcpy(stmtbuf, delete from salesreps

where empl num = :rep number ); exec sql prepare delstmt from :stmtbuf; exec sql execute delstmt using :employee number;

Хотя rep number выглядит как базовая переменная в динамической инструкции delete, фактически она является именованным параметром. Как видно из данного Примера, именованные параметры аналогичны маркерам параметров в DB2. Значение параметра берется из настоящей базовой переменной в инструкции execute. Именованные парамефы очень удобны, когда применяются динамические инструкции с переменным число.м параметров.

Инструкция DESCRIBE

Инструкция describe в Oracle, как и в DB2, применяется для описания таблицы результатов динамического запроса. Аналогично DB2, описание возвращается в область sqlda. Инструкцию describe в Oracle можно также использовать для описания



1 ... 155 156 157 [ 158 ] 159 160 161 ... 264

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