如何获取数据库中当前用户创建的所有PL/SQL确定性函数列表?
获取当前用户的PL/SQL确定性函数列表
嘿,这事儿不难,我给你几个实用的查询语句,帮你快速找出当前用户名下所有的PL/SQL确定性函数:
基础查询:独立确定性函数
如果你只需要独立函数(不属于任何包的函数)的基本信息,用这个查询就够了:
SELECT object_name AS function_name, created, last_ddl_time, status FROM user_functions WHERE deterministic = 'YES';
user_functions视图专门存储当前用户拥有的独立函数信息deterministic = 'YES'过滤出标记为确定性的函数- 结果会返回函数名、创建时间、最后修改时间以及函数状态(有效/无效)
进阶查询:包含参数信息的函数列表
要是你还想查看函数的参数、返回类型等细节,可以结合user_arguments视图:
SELECT f.object_name AS function_name, a.argument_name, a.data_type, a.in_out, f.deterministic, f.status FROM user_functions f JOIN user_arguments a ON f.object_name = a.object_name WHERE f.deterministic = 'YES' ORDER BY f.object_name, a.position;
这个查询会把每个函数的输入/输出参数、参数类型都列出来,按函数名和参数顺序排序,方便你查看完整的函数签名。
完整查询:包含包内的确定性函数
上面的查询只覆盖了独立函数,如果你的函数是定义在PL/SQL包里的,得用user_procedures视图来补充:
-- 合并独立函数和包内函数的完整列表 SELECT object_name AS function_name, NULL AS package_name, created, last_ddl_time, status FROM user_functions WHERE deterministic = 'YES' UNION ALL SELECT procedure_name AS function_name, object_name AS package_name, created, last_ddl_time, status FROM user_procedures WHERE object_type = 'FUNCTION' AND deterministic = 'YES';
UNION ALL把两个查询的结果合并,没有去重(因为独立函数和包内函数不会重名冲突)package_name列会显示函数所属的包名,独立函数这一列是NULL,方便你区分两种类型的函数
小提示
- 普通用户默认都能访问
user_*开头的数据字典视图,因为这些视图只展示当前用户拥有的对象,不需要额外权限 - 记住:Oracle里的
DETERMINISTIC是一个优化提示,标记为YES的函数应该保证相同输入永远返回相同输出,且不依赖外部状态(比如当前时间、表数据变化等),不然优化器可能会产生错误的执行计划
内容的提问来源于stack exchange,提问作者nnenthusiast
相关产品推荐
相关产品推荐

