удаление табличного пространства, если они не существуют

#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 такие инструкции не могут выполняться статически.

Oracle dynamic SQL