Правильная ссылка на эту страницу
http://az-design.ru/Support/DataBase/SQL/SQL92/SQL92-2Prepare.shtml

[ Только для динамического SQL ]

PREPARE
Создает SQL-оператор из символьной строки

Синтаксис

PREPARE [GLOBAL|LOCAL] имя оператора SQL
   FROM имя переменной, содержащей символьную строку;

Использование
       При работе в динамическом SQL чаще всего заранее неизвестно, какой SQL-оператор потребуется в момент исполнения приложения. Поэтому стандарт разрешает создавать операторы в процессе исполнения приложения, сначала запоминая текст необходимого предложения в символьной переменной, затем преобразуя эту переменную в SQL-оператор. Создание правильных SQL-операторов из символьных строк пользователя или приложения обеспечивается на уровне конкретной реализации. Однако на способ преобразования созданной символьной строки существенно влияет то, какой из двух используемых для этого операторов определен. Оператор EXECUTE IMMEDIATE преобразует строку и сразу же исполняет оператор. Оператор PREPARE создает SQL-оператор из текста, который затем может повторно исполняться с помощью оператора EXECUTE. Кроме того, оператор PREPARE (если подготовленный оператор является запросом без предложения INTO (см. оператор SELECT) может быть включен в курсор с помощью оператора ALLOCATE CURSOR или DECLARE CURSOR.

Примечание
       Если ранее был подготовлен оператор с тем же самым именем, то он будет автоматически заменен на подготовленный в данный момент и, возможно, даже без предупреждающего сообщения (так как стандарт не предусматривает такого сообщения).
       Допускается определение области действия как GLOBAL или LOCAL, которая определяет "видимость" подготовленного оператора. Если область определена как GLOBAL, то подготовленный оператор доступен любому оператору сеанса. В противном случае он может быть доступен только внутри модуля (возможно эмулирующего) (см. приложение С). Если область не определена, по умолчанию принимается значение LOCAL. Два подготовленных оператора с одинаковыми именами, но разной областью действия, рассматриваются как операторы с различными именами.
       Символьная строка, хранящаяся в переменной, должна сразу после удаления лидирующих и конечных пробелов соответствовать тексту какого-либо допустимого SQL-оператора без комментариев. В нем могут использоваться динамические параметры, однако их применение должно удовлетворять следующим условиям:

       • Динамические параметры нельзя включать в предложение SELECT "напрямую".
       • Нельзя использовать одинаковые динамические параметры с обеих сторон знака бинарной операции; например, недопустимы такие выражения: ?=? или ?>?.
       • Нельзя использовать динамический параметр в выражениях типа:

         ? COLLATE сравнение

       (см. раздел "Сравнения" главы III) или

         EXTRACT (извлекаемое поле FROM ?) 

       (см. раздел "Функции для вычисления числовых значений" главы III).
       • Динамические параметры нельзя использовать в качестве аргумента функций агрегирования (см. раздел "Функции агрегирования" главы III).
       • Нельзя использовать динамические параметры в качестве конструкторов значений строк, которые проверяются с помощью NULL-предиката (см. разделы "Предикаты" и "Конструкторы значений строк и таблиц" главы III).
       • Нельзя использовать динамический параметр в качестве второго элемента конструктора значений строк, который проверяется с помощью предиката OVERLAPS (см. разделы "Предикаты" и "Конструкторы значений строк и таблиц" главы III).
       • Спецификацию динамического параметра нельзя использовать в качестве первого операнда предложения COALESCE, или первого условия WHEN выражения CASE или в качестве любого операнда выражения NULLIF (см. раздел "Выражения CASE" главы III).
       • Если используются операторы сравнения или предикат BETWEEN с конструкторами значений строк, нельзя использовать в них динамический параметр, так чтобы он сравнивался сам с собой (например, в одной и той же позиции конструктора с обеих сторон сравнения типа "равенство".
       • То же относится и к динамическим параметрам в конструкторах значений таблицы. Ни один параметр не может находиться в одном и том же столбце для каждой строки конструктора табличных значений. Исключением является оператор INSERT, когда конструктор используется для генерации значений, используемых этим оператором (см. описание оператора INSERT в этой главе и раздел "Конструкторы значений строк и таблиц" главы III).
       • Если спецификация динамического параметра является конструктором значений строки, используемым в предикате IN, то этот параметр не может быть одновременно конструктором и первым элементом в списке, с которым производится сравнение (см. разделы "Предикаты", "Конструкторы значений строк и таблиц" главы III").

Примечание
       Так как оператор ALLOCATE CURSOR создает имена курсоров во время исполнения приложения, то можно дублировать имена более постоянных курсоров, построенных с помощью DECLARE CURSOR. В тексте подготовленного оператора разрешайся ссылки на курсоры любого типа, однако может возникнуть ошибка, если такая ссылка приводит к неопределенной ситуации, возникающей из-за дублирования имен.
       Если все описанные выше условия соблюдены, то оператор готов к исполнению. Сохранится ли подготовленный оператор после завершения транзакции или его необходимо "готовить" заново, — зависит от реализации.

Пример
       Следующий оператор преобразует переменную "SQLstmt5" (типа символьная строка) в подготовленный оператор "Statement5". Этот оператор остается доступным в течение всего сеанса. В примере показано также содержимое переменной "SQLstmt". Оператор использует динамический параметр для значения city (город), по которому должно производиться сравнение. Для динамического параметра должно быть назначено фактическое значение при исполнении оператора с помощью EXECUTE.

SQLstmtS ::= 'SELECT * FROM Salepeople WHERE city = ?' PREPARE GLOBAL Statement5 FROM :SQLstmt5;

Уровни соответствия

Intermed   Приложения этого уровня не требуют поддержки ни одного из следующих подготовленных операторов: CREATE ASSERTION, DROP ASSERTION, CREATE COLLATION, DROP COLLATION, CREATE TRANSLATION, DROP TRANSLATION, SET SCHEMA, SET CATALOG, SET NAMES, SET CONSTRAINTS MODE, SELECT (используется вне курсоров, т.е. оператор SELECT одной строки).
Entry   Приложения этого уровня вообще не требуют поддержки динамического SQL.

См. также
       главу II операторы EXECUTE, EXECUTE IMMEDIATE, главу III раздел "Предикаты", "Конструкторы значений строк и таблиц", "Выражения для вычисления значений", приложение С.


  Оглавление
Начало раздела
След.>>




Дата последнего изменения:
Thursday, 21-Aug-2014 09:10:55 MSK


Постоянный адрес статьи:
http://az-design.ru/Support/DataBase/SQL/SQL92/SQL92-2Prepare.shtml