需要帮助
如何检查软件包是否存在,如果存在则跳过创建。
我已完成以下操作,但出现错误
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中是正确的方法吗?
首先-不,这是错误的方法。动态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
(或不运行)。>>
您的代码只有一个问题。