在Oracle中,包分为包头(PACKAGE)和包体(PACKAGE BODY),存储过程的实现代码在包体中。以下是几种查找方法:
方法1:查找包中包含关键字的存储过程
-- 查找包体(PACKAGE BODY)中包含关键字的存储过程定义 SELECT DISTINCT s.owner, s.name AS 包名, 'PACKAGE BODY' AS 对象类型 FROM all_source s WHERE UPPER(s.text) LIKE UPPER('%关键字%') AND s.type = 'PACKAGE BODY' ORDER BY s.owner, s.name;方法2:同时查找包头和包体
-- 同时查找包头和包体 SELECT DISTINCT s.owner, s.name AS 对象名称, CASE s.type WHEN 'PACKAGE' THEN '包头' WHEN 'PACKAGE BODY' THEN '包体' END AS 对象类型 FROM all_source s WHERE UPPER(s.text) LIKE UPPER('%关键字%') AND s.type IN ('PACKAGE', 'PACKAGE BODY') ORDER BY s.owner, s.type DESC, s.name;方法3:查找包中特定的存储过程定义
-- 查找包含特定存储过程定义的行 SELECT s.owner, s.name AS 包名, s.line, s.text AS 代码行 FROM all_source s WHERE (UPPER(s.text) LIKE UPPER('%PROCEDURE%') AND UPPER(s.text) LIKE UPPER('%关键字%')) AND s.type = 'PACKAGE BODY' ORDER BY s.owner, s.name, s.line;方法4:结合查询包中的存储过程和函数
-- 查找包中的存储过程和函数 SELECT s.owner, s.name AS 包名, s.line, TRIM(s.text) AS 代码行 FROM all_source s WHERE s.type = 'PACKAGE BODY' AND ( -- 查找存储过程定义 (REGEXP_LIKE(UPPER(TRIM(s.text)), '^PROCEDURE\s+', 'c') AND UPPER(s.text) LIKE UPPER('%关键字%')) OR -- 查找函数定义 (REGEXP_LIKE(UPPER(TRIM(s.text)), '^FUNCTION\s+', 'c') AND UPPER(s.text) LIKE UPPER('%关键字%')) ) ORDER BY s.owner, s.name, s.line;方法5:提取包中特定的存储过程名称
-- 提取包中包含关键字的存储过程名称 SELECT DISTINCT p.owner, p.object_name AS 包名, p.procedure_name AS 存储过程名 FROM all_procedures p WHERE p.object_type = 'PACKAGE' AND p.procedure_name IS NOT NULL AND EXISTS ( SELECT 1 FROM all_source s WHERE s.owner = p.owner AND s.name = p.object_name AND s.type = 'PACKAGE BODY' AND UPPER(s.text) LIKE UPPER('%关键字%') AND UPPER(s.text) LIKE UPPER('%' || p.procedure_name || '%') ) ORDER BY p.owner, p.object_name, p.procedure_name;方法6:综合查找(包括独立存储过程和包中存储过程)
-- 综合查找:独立存储过程 + 包中的存储过程 WITH search_results AS ( -- 查找独立存储过程 SELECT DISTINCT s.owner, s.name AS 对象名, 'STANDALONE PROCEDURE' AS 对象类型, NULL AS 包名 FROM all_source s WHERE UPPER(s.text) LIKE UPPER('%关键字%') AND s.type = 'PROCEDURE' UNION ALL -- 查找包 SELECT DISTINCT s.owner, s.name AS 对象名, 'PACKAGE BODY' AS 对象类型, s.name AS 包名 FROM all_source s WHERE UPPER(s.text) LIKE UPPER('%关键字%') AND s.type = 'PACKAGE BODY' ) SELECT * FROM search_results ORDER BY owner, 对象类型, 对象名;方法7:查找包含关键字的特定存储过程调用
-- 查找在代码中调用包含关键字的存储过程 SELECT s.owner, s.name AS 对象名, s.type AS 对象类型, s.line, s.text AS 代码行 FROM all_source s WHERE (UPPER(s.text) LIKE UPPER('%关键字%') AND REGEXP_LIKE(UPPER(s.text), '^\s*(PROCEDURE|FUNCTION)\s+\w+', 'i')) OR (UPPER(s.text) LIKE UPPER('%关键字%') AND REGEXP_LIKE(s.text, '\.\s*\w+\s*\(', 'i')) ORDER BY s.owner, s.name, s.line;实用示例
-- 示例1:查找包含"employee"的包 SELECT DISTINCT s.owner, s.name AS 包名 FROM all_source s WHERE UPPER(s.text) LIKE UPPER('%employee%') AND s.type = 'PACKAGE BODY' ORDER BY s.owner, s.name; -- 示例2:查找包中名为"calculate"的存储过程 SELECT s.owner, s.name AS 包名, s.line, s.text AS 代码行 FROM all_source s WHERE s.type = 'PACKAGE BODY' AND UPPER(s.text) LIKE UPPER('%PROCEDURE%CALCULATE%') ORDER BY s.owner, s.name, s.line;重要提示
包体包含实现代码:存储过程的实际代码在
PACKAGE BODY中包头包含声明:包头(
PACKAGE)只包含存储过程的声明使用ALL_PROCEDURES视图:可以获取包中所有存储过程的信息
性能考虑:包通常较大,搜索可能会比较慢,建议添加更多过滤条件
通过以上查询,您可以有效地查找包含特定关键词的存储过程,无论它们是独立的还是在包中定义的。