检查包是否存在,然后在Oracle中创建它

问题描述 投票:0回答:1

需要帮助

如何检查软件包是否存在,如果存在则跳过创建。

我已完成以下操作,但出现错误

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中是正确的方法吗?

oracle package exists
1个回答
1
投票

首先-不,这是错误的方法。动态SQL存在这一事实并不意味着您应该使用它,尤其是不要用于创建程序包(或任何其他对象)。您确实很想这样做。

PL / SQL过程(函数,程序包,触发器)提供create OR REPLACE选项,因此-运行该语句as is是安全的(不是动态SQL)。这意味着:

  • 如果不存在,它将被创建
  • 如果存在,它将被您刚运行的代码覆盖

如果您坚持使用动态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(或不运行)。>>


0
投票

您的代码只有一个问题。

© www.soinside.com 2019 - 2024. All rights reserved.