10

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

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

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

4

5 回答 5

15

您应该能够从 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 异常,则表示程序包中不存在该过程。

分享和享受。

于 2012-07-11T15:53:19.063 回答
3

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

select * from SYS.User_Objects where object_type = 'PACKAGE';
于 2015-03-13T14:33:12.867 回答
2

你也可以试试

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

为我工作...

于 2017-07-19T20:39:47.713 回答
0

如果您以普通用户身份执行代码,则根本看不到 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>';
于 2021-05-26T13:09:07.250 回答
-1
select * from USER_OBJECT where object_type='PACKAGE' AND OBJECT_NAME ='<YOUR PACKAGE NAME>'
于 2012-07-15T13:20:54.587 回答