Проверьте пакет существует или нет, прежде чем создать его в Oracle - PullRequest
0 голосов
/ 16 апреля 2020

Нужна помощь

Как проверить пакет, если он существует или нет, и пропустить создание, если оно уже существует.

Я сделал следующее и получил ошибку

DECLARE
    l_cnt INTEGER;
    own   VARCHAR(200);
BEGIN
    SELECT sys_context( 'userenv', 'current_schema' ) INTO own FROM dual;
    SELECT count(*)
    INTO l_cnt
    FROM ALL_OBJECTS
    WHERE object_type = 'PACKAGE' 
    and object_name = 'JUSTICE_LEAGUE'
      AND OWNER        = own;
    IF( l_cnt       <= 0) THEN

EXECUTE IMMEDIATE 
'create or replace PACKAGE "JUSTICE_LEAGUE" AS

FUNCTION BATMAN(argPSN INT)
RETURN INT;

FUNCTION SUPERMAN(argSN int)
RETURN Info.infovalue%Type;

PROCEDURE AQUAMAN(argASN INT,argAssignedUser folderProcess.assignedUser%Type DEFAULT 'None');

END JUSTICE_LEAGUE';

DBMS_OUTPUT.PUT_LINE('Package created successfully');
    ELSE
DBMS_OUTPUT.PUT_LINE('Package exists already');

END IF;
END;
/

Error report -
ORA-06550: line 23, column 70:
PLS-00103: Encountered the symbol "ALL" when expecting one of the following:

Это правильный способ поместить команду создания для пакета в EXECUTE IMMEDIATE?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Прежде всего - нет, это неправильный способ сделать это. Тот факт, что Dynami c SQL существует, не означает, что вы должны использовать его, особенно не для создания пакетов (или любых других объектов). Есть действительно редкие ситуации, в которых вы бы хотели это сделать.

PL / SQL процедуры (функции, пакеты, триггеры) предлагают опцию create OR REPLACE , так что запускать безопасно. это утверждение как (не как Dynami c SQL). Это означает, что:

  • , если он не существует, он будет создан
  • , если он существует, он будет перезаписан кодом, который вы ' мы только что запустили

Если вы настаиваете на Dynami c SQL, проверьте его наличие (пакет), запросив user_objects:

SQL> select count(*)
  2  from user_objects
  3  where object_name = 'JUSTICE_LEAGUE'
  4    and object_type = 'PACKAGE';

  COUNT(*)
----------
         0

SQL>

В зависимости от результата, выполните execute immediate (или нет).

1 голос
/ 16 апреля 2020

Существует только одна проблема с вашим кодом.

Вы не обработали динамический запрос c правильно. одиночная кавычка в динамическом запросе c должна быть экранирована.

Две одинарные кавычки ('') в строке рассматриваются как одна одинарная кавычка (') в последней строке. Или вы можете использовать строку в кавычках (q'{<your_string>}')

заменить - DEFAULT 'None'); на DEFAULT ''None'');

...