【问题标题】:How can I check if a procedure exists in a package?如何检查程序包中是否存在程序?
【发布时间】:2021-05-26 21:09:07
【问题描述】:

我有带有程序的包,这些程序在很多地方都使用过,在某些地方我需要稍微不同的程序,例如再更新一列。

我想我可以创建一个额外的包,其中包含一些但不是全部的过程。

有没有办法直接在脚本中检查if 语句,如果额外包中不存在过程,则退回到标准包?

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您应该能够从 DBA_PROCEDURES 视图中获取此信息:

    SELECT *
      FROM SYS.DBA_PROCEDURES
      WHERE OBJECT_TYPE = 'PACKAGE' AND
            OBJECT_NAME = '<your package name>' AND
            PROCEDURE_NAME = '<your procedure name>'
    

    如果这返回一行,则您感兴趣的过程存在于包中。如果您收到 NO_DATA_FOUND 异常,则表示该程序不存在于包中。

    分享和享受。

    【讨论】:

      【解决方案2】:

      查询 SYS.DBA_PROCEDURES 的用户不需要特殊权限吗?也许查询 SYS.User_Objects 需要更少的权限?

      select * from SYS.User_Objects where object_type = 'PACKAGE';
      

      【讨论】:

        【解决方案3】:

        你也可以试试

        SELECT text FROM all_source WHERE name = 'PACKAGE' ORDER BY line;
        

        为我工作...

        【讨论】:

          【解决方案4】:

          如果您以 普通 用户身份执行代码,则根本看不到 SYS.DBA_PROCEDURES。

          但是您可以从用户可访问的表 user_procedures 中执行相同操作:

          SELECT * 
            FROM USER_PROCEDURES 
            WHERE OBJECT_TYPE='PACKAGE' AND 
                  OBJECT_NAME ='<your package name>' AND 
                  PROCEDURE_NAME = '<your procedure name>';
          

          【讨论】:

            【解决方案5】:
            select * from USER_OBJECT where object_type='PACKAGE' AND OBJECT_NAME ='<YOUR PACKAGE NAME>'
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-06-18
              • 2010-10-30
              • 2011-02-06
              • 2019-08-10
              • 1970-01-01
              • 2011-08-02
              • 1970-01-01
              相关资源
              最近更新 更多