Читать «Язык PL/SQL» онлайн - страница 89

Иван Сергеевич Задворьев

встроенный пакет DBMS_SQL.

Динамический SQL в Oracle принято делить на четыре категории.

Таблица 11. Категории динамического SQL в Oracle.

Категория

Описание категории

Категория 1

DDL-команды и предложения UPDATE, INSERT и DELETE без параметров

Категория 2

DDL-команды и предложения UPDATE, INSERT и DELETE с фиксированным количеством параметров

Категория 3

предложения SELECT с фиксированным количеством столбцов и параметров

Категория 4

DML-предложения, в которых количество выбранных столбцов (для запросов) или количество параметров (для всех предложений) неизвестно до стадии выполнения

С помощью встроенного пакета DBMS_SQL можно выполнить динамический SQL всех четырех категорий, с помощью NDS – первых трех категорий, на которые приходится, по некоторым оценкам, до 90% всего динамического SQL.

Встроенный динамический SQL

Главным достоинством NDS является его простота. Для выполнения динамического SQL в пакете DBMS_SQL в общем случае требуется 8 этапов, при этом код PL/SQL выглядит довольно громоздко и далее будет возможность в этом убедиться. С NDS обходятся вызовом одной команды EXECUTE IMMEDIATE («выполнить немедленно»), которая имеет следующий синтаксис:

EXECUTE IMMEDIATE предложение SQL

[ [ BULK COLLECT] INTO {переменная[, переменная]… | запись PL/SQL}]

[USING аргумент[,аргумент]…];

Сразу после ключевых слов EXECUTE IMMEDIATE в одинарных кавычках указывается текст предложения SQL, также в этом месте можно указать символьную переменную с текстом предложения SQL, причем эта переменная может иметь тип данных как VARCHAR2, так и CLOB.

Конструкция INTO со списком переменных предназначена для получения значений столбцов результирующей выборки и используется в том случае, если выполняется предложение SELECT. Число переменных и число столбцов должно совпадать. Переменные в конструкции INTO должны быть скалярных типов данных, соответствующих типам столбцов, или одной записью PL/SQL.

Конструкция USING со списком переменных и констант используется для передачи значений, которые должны быть связаны с имеющимися в тексте предложения SQL связываемыми переменными. Связывание значений в NDS осуществляется по позициям связываемых переменных. Количество передаваемых значений, естественно, должно совпадать c количеством связываемых переменных.

Для SQL-запросов команда EXECUTE IMMEDIATE фактически является аналогом команды SELECT INTO с таким же ограничением на результирующую выборку: запросом должна отбираться ровно одна строка, в противном случае инициируются предопределенные исключения.

Рассмотрим пример использования команды EXECUTE IMMEDIATE:

CREATE TABLE tab1 (at1 INT, at2 VARCHAR2(1));

INSERT INTO tab1 VALUES(1,'A');

INSERT INTO tab1 VALUES(2,'B');

SQL> DECLARE

2 l_tab1 tab1%ROWTYPE;

3 l_sql_text VARCHAR2(100) := 'SELECT * FROM tab1 WHERE at1>=:p_at1';

4 BEGIN

5

6 EXECUTE IMMEDIATE l_sql_text INTO l_tab1_rec USING 2;

7 DBMS_OUTPUT.PUT_LINE('Отобранная строка: '||l_tab1.at1||l_tab1.at2);

8

9 BEGIN

10 EXECUTE IMMEDIATE l_sql_text INTO l_tab1 USING 1;

11 EXCEPTION

12 WHEN OTHERS THEN