应优先使用USER_PROCEDURES查当前用户存储过程,用USER_SOURCE查源码,用ALL_ARGUMENTS(加OWNER过滤)查参数,用DBMS_METADATA.GET_DDL导出完整DDL;注意大小写、权限及包内过程的命名规则。
查当前用户所有存储过程:用 USER_PROCEDURES,别碰 DBA_PROCEDURES
除非你有 select_catalog_role 或 dba 权限,否则直接查 dba_procedures 会报错 ora-00942: table or view does not exist。普通开发或应用账号默认只能看自己拥有的对象,所以优先用 user_procedures:
-
SELECT procedure_name, object_id FROM USER_PROCEDURES ORDER BY procedure_name;—— 最轻量,只列名称和ID -
SELECT * FROM USER_PROCEDURES WHERE procedure_name LIKE 'P_%';—— 加条件过滤更实用 - 注意:
USER_PROCEDURES不包含源码,只含元数据(如是否为包内过程、是否重载)
查某个存储过程的完整源码:用 USER_SOURCE,不是 ALL_SOURCE
ALL_SOURCE 会扫全库所有可访问的存储过程,权限不足时可能漏数据或报错;而 USER_SOURCE 只查当前用户创建的,稳定且无需额外授权:
-
SELECT text FROM USER_SOURCE WHERE name = 'MY_PROC' ORDER BY line;—— 必须大写过程名,且按line排序才不会乱序 - 如果返回空,先确认是否存在:
SELECT object_name FROM USER_OBJECTS WHERE object_type = 'PROCEDURE' AND object_name = 'MY_PROC'; - 若过程在包里(比如
pkg_name.proc_name),name字段存的是包名PKG_NAME,不是PKG_NAME.PROC_NAME
查存储过程参数定义:用 ALL_ARGUMENTS,但要加 OWNER 过滤
ALL_ARGUMENTS 是查参数最准的视图,但它默认包含所有用户的过程参数,容易混入系统过程或别人的过程。必须限定 OWNER 才可靠:
SELECT argument_name, data_type, in_out, position FROM ALL_ARGUMENTS WHERE owner = 'YOUR_SCHEMA' AND object_name = 'MY_PROC' ORDER BY position;- 不要用
USER_ARGUMENTS—— 它不返回OWNER字段,无法区分同名过程在不同 schema 的情况 - 若参数是
IN OUT类型,in_out值为IN/OUT(带斜杠),不是字符串'IN OUT'
想导出 DDL(建过程语句):用 DBMS_METADATA.GET_DDL,不是 DESC
DESC my_proc 只显示签名(参数列表),不显示函数体、异常块、注释等。真正要还原可执行的建过程脚本,得靠 DBMS_METADATA:
-
SELECT DBMS_METADATA.GET_DDL('PROCEDURE', 'MY_PROC') FROM DUAL;—— 自动识别所属 schema,不用手动填owner - 如果过程在包里,类型应为
'PACKAGE BODY',且对象名填包名,例如DBMS_METADATA.GET_DDL('PACKAGE BODY', 'MY_PKG') - 输出结果可能被截断(默认 4000 字符),在 SQL*Plus 中先运行:
SET LONG 1000000再执行
查存储过程最常卡在权限和大小写上:视图名、过程名、schema 名全是大写;没权限硬查 DBA_* 视图只会白忙活;包内过程的源码藏在包名下,不是过程名下。这些点不提前踩一遍,很容易以为“查不到”,其实是查错了地方。











