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. Подстановка и конкатенация
‘UPDATE ‘ || tab || ‘SET sal = :new_sal ’
USING v_sal;
‘UPDATE ‘ || tab || ‘SET sal = ’ || v_sal;
3.3.2. Ограничения на подстановку
· В качестве параметров можно использовать только значения данных (литералы, переменные, выражения)
· Нельзя использовать имена объектов БД (таблиц, столбцов и т.п.)
3.3.3. Режимы использования параметров
· В режиме IN – любой элемент: литерал, константа, переменная или выражение
· В режимах OUT и INOUT – использовать переменную
· Тип данных подставляемых значений должен поддерживаться SQL (например, нельзя BOOLEAN)
Дублирование формальных параметров
· В динамическом SQL (DML- и DDL-строки, не оканчивающиеся точкой с запятой) подстановка задается для каждого формального параметра, с учетом их повторений
· В динамическом блоке PL/SQL (строки, заканчивающиеся точкой с запятой) параметры подстановки задаются только для каждого уникального формального параметра
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;
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;
END;
Передачазначения NULL
Нельзя написать:
EXECUTE IMMEDIATE
‘UPDATE emp SET salary = :val
WHERE hiredate IS NOT NULL’
USING NULL;
· Скрыть в переменной
· Использовать функцию преобразования типов
val_in NUMBER;
EXECUTE IMMEDIATE
‘UPDATE emp SET salary = :val
WHERE hiredate IS NOT NULL’
USING val_in;
END;
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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.