удалить табличное пространство, если не существует - PullRequest
4 голосов
/ 31 мая 2011

Я написал скрипт 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 Ответ

5 голосов
/ 31 мая 2011

Нет.Вы не можете выдавать операторы DDL в статическом PL / SQL.

И да, вполне нормально использовать собственный динамический SQL для целей DDL:

Вам необходим динамический SQL в следующих ситуациях:

Требуется выполнить оператор определения данных SQL (например, CREATE), оператор управления данными (например, GRANT) или оператор управления сеансом (например, ALTER SESSION).В PL / SQL такие операторы не могут выполняться статически.

Oracle динамический SQL

...