#sql #oracle #plsql #ddl
#sql #Oracle #plsql #ddl
Вопрос:
Я написал скрипт pl / sql (работает, но выглядит не очень красиво):
DECLARE
v_exists NUMBER;
BEGIN
SELECT count(*) INTO v_exists FROM dba_tablespaces WHERE tablespace_name = 'hr_test';
IF v_exists > 0 THEN
BEGIN
EXECUTE IMMEDIATE 'DROP TABLESPACE hr_test INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS';
END;
END IF;
EXECUTE IMMEDIATE 'CREATE TABLESPACE hr_RJ DATAFILE ''E:hr_test_01.dbf'' SIZE 16M';
END;
Есть ли какой-либо способ переписать этот скрипт без EXECUTE IMMEDIATE
?
Комментарии:
1. Лучшим подходом было бы вообще не запускать
SELECT count(*)
— просто запуститеDROP
и обработайте исключение «табличное пространство не найдено», если оно возникнет.
Ответ №1:
Нет. Вы не можете выполнять инструкции DDL в статическом PL / SQL.
И да, использовать собственный динамический SQL для целей DDL совершенно нормально:
Динамический SQL необходим в следующих ситуациях:
Вы хотите выполнить инструкцию определения данных SQL (например, CREATE), инструкцию управления данными (например, GRANT) или инструкцию управления сеансом (например, ALTER SESSION). В PL / SQL такие инструкции не могут выполняться статически.