【发布时间】:2021-05-26 21:09:07
【问题描述】:
我有带有程序的包,这些程序在很多地方都使用过,在某些地方我需要稍微不同的程序,例如再更新一列。
我想我可以创建一个额外的包,其中包含一些但不是全部的过程。
有没有办法直接在脚本中检查if 语句,如果额外包中不存在过程,则退回到标准包?
【问题讨论】:
我有带有程序的包,这些程序在很多地方都使用过,在某些地方我需要稍微不同的程序,例如再更新一列。
我想我可以创建一个额外的包,其中包含一些但不是全部的过程。
有没有办法直接在脚本中检查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>'
【讨论】: