【问题标题】:Check Package exist or not before create it in Oracle在 Oracle 中创建之前检查包是否存在
【发布时间】:2020-07-29 07:44:20
【问题描述】:

需要帮助

我如何检查一个包是否存在,如果它已经存在则跳过创建。

我执行了以下操作,但出现错误

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】:

首先 - 不,这样做是错误的。动态 SQL 存在这一事实并不意味着您应该使用它,尤其是不用于创建包(或任何其他对象)。在极少数情况下您会想要这样做。

PL/SQL 过程(函数、包、触发器)提供了创建 OR REPLACE 选项 - 运行该语句是安全的按原样(不是动态 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(或不运行)。

【讨论】:

  • 我完全同意你@Littlefoot 的观点,但这是一种特殊情况,很多数据库都有这个可用的包,并且已经根据那里的工作进行了定制。我无法覆盖那里的包,但如果他们没有基线包,我可以添加。
  • 好的;然后只需使用 CREATE PACKAGE 运行它(即省略 REPLACE)。如果它存在,它将失败,并且不会发生任何事情(但是)。你为什么关心它是否失败?我的意思是 - 让它变得简单。
  • 如果我这样做了,那么执行查询的用户将看到错误并担心为什么会出现错误。你认为有办法解决这个问题吗?我按照你说的方式做,并删除 and Replace 部分。以后出现的错误我该怎么办。
【解决方案2】:

您的代码只有一个问题。

您没有正确处理动态查询。动态查询中的单引号必须转义。

字符串中的两个单引号('')被视为最终字符串中的一个单引号(')。 或者您可以使用带引号的字符串 (q'{&lt;your_string&gt;}')

替换 -- DEFAULT 'None');DEFAULT ''None'');

【讨论】:

  • 如果我在 Execute Immedtiade ' ' 中添加一个包体怎么办
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 2012-01-10
  • 2015-03-28
  • 2011-08-21
  • 2015-08-14
  • 1970-01-01
相关资源
最近更新 更多