|
Программирование >> Sql: полное руководство
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 можно также использовать для описания
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |