Динамический SQL, страница 3

         END LOOP;

         CLOSE  v_SalCur;

END;

/

3.2.2. Однострочные запросы

EXECUTE IMMEDIATE строка_символов_sql

                   INTO список_определения

                   [USINGсписок_привязки];

DECLARE

v_SQLQuery VARCHAR2(200);

v_Sal             sal%ROWTYPE;

v_City            VARCHAR2(10);

v_Cnt             NUMBER;

BEGIN

v_City :=  ‘London’;

v_SQLQuery  :=

‘SELECT  count(*)  FROM sal  WHERE city =’’’ || v_City || ‘’’’;

EXECUTE IMMEDIATE v_SQLQuery  INTO v_Cnt;

DBMS_OUTPUT.PUT_LINE(‘Fetched count = ’ || v_Cnt);

END;

/

3.3. Передача значений параметров

3.3.1. Подстановка и конкатенация

EXECUTE IMMEDIATE

‘UPDATE ‘ || tab || ‘SET sal = :new_sal ’

USING v_sal;

EXECUTE IMMEDIATE

‘UPDATE ‘ || tab || ‘SET sal = ’ || v_sal;

3.3.2. Ограничения на подстановку

·  В качестве параметров можно использовать только значения данных (литералы, переменные, выражения)

·  Нельзя использовать имена объектов БД (таблиц, столбцов и т.п.)

3.3.3. Режимы использования параметров

·  В режиме IN – любой элемент: литерал, константа, переменная или выражение

·  В режимах OUT и  INOUT – использовать переменную

·  Тип данных подставляемых значений должен поддерживаться SQL (например, нельзя BOOLEAN)

Дублирование формальных параметров

·  В динамическом SQL (DML- и DDL-строки, не оканчивающиеся точкой с запятой) подстановка задается для каждого формального параметра, с учетом их повторений

·  В динамическом блоке PL/SQL (строки, заканчивающиеся точкой с запятой) параметры подстановки задаются только для каждого уникального формального параметра

BEGIN

EXECUTE IMMEDIATE

‘UPDATE emp SET col_1 = :val

WHERE hiredate BETWEEN :ndate AND :kdate

AND :val IS NOT NULL’

USING val_in, start_in, end_in, val_in;

END;

BEGIN

EXECUTE IMMEDIATE

‘BEGIN

UPDATE emp SET col_1 = :val

WHERE hiredate BETWEEN :ndate AND :kdate

AND :val IS NOT NULL

END;’

USING val_in, start_in, end_in;

END;

Передачазначения NULL

Нельзя написать:

EXECUTE IMMEDIATE

‘UPDATE emp SET salary = :val

WHERE hiredate IS NOT NULL’

USING NULL;

·  Скрыть в переменной

·  Использовать функцию преобразования типов

DECLARE

val_in NUMBER;

BEGIN

EXECUTE IMMEDIATE

‘UPDATE emp SET salary = :val

WHERE hiredate IS NOT NULL’

USING val_in;

END;

BEGIN

EXECUTE IMMEDIATE

‘UPDATE emp SET salary = :val

WHERE hiredate IS NOT NULL’

USING TO_NUMBER(NULL);

END;

Программы с правами вызывающего

CREATE OR REPLACE PROCEDURE execDDL (ddl_str IN VARCHAR2)