我有程序包,在许多地方使用,在某些地方我需要稍微不同的程序,例如再更新一列。
我想我可以创建一个额外的包,其中包含一些但不是全部的过程。
有没有办法if
直接在脚本中检查语句,如果额外包中不存在过程,则退回到标准包?
您应该能够从 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 异常,则表示程序包中不存在该过程。
分享和享受。
查询 SYS.DBA_PROCEDURES 的用户不需要特殊权限吗?也许查询 SYS.User_Objects 需要更少的权限?
select * from SYS.User_Objects where object_type = 'PACKAGE';
你也可以试试
SELECT text FROM all_source WHERE name = 'PACKAGE' ORDER BY line;
为我工作...
如果您以普通用户身份执行代码,则根本看不到 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>';
select * from USER_OBJECT where object_type='PACKAGE' AND OBJECT_NAME ='<YOUR PACKAGE NAME>'