在Oracle中,包分为包头(PACKAGE)和包体(PACKAGE BODY),存储过程的实现代码在包体中。以下是几种查找方法

在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;

重要提示

  1. 包体包含实现代码 :存储过程的实际代码在PACKAGE BODY中

  2. 包头包含声明 :包头(PACKAGE)只包含存储过程的声明

  3. 使用ALL_PROCEDURES视图:可以获取包中所有存储过程的信息

  4. 性能考虑:包通常较大,搜索可能会比较慢,建议添加更多过滤条件

通过以上查询,您可以有效地查找包含特定关键词的存储过程,无论它们是独立的还是在包中定义的。

相关推荐
心梦缘-雪雁4 分钟前
SQL Server 查询数据存在哪个表里
数据库
lusklusklusk1 小时前
Python 巡检脚本:进程运行状态、数据库写入时效检查及邮件通知与告警
数据库·python·oracle
GeW1 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
SelectDB1 小时前
Doris Arrow Flight SQL 高速读取协议实战:与 Snowflake 客户端取数链路对照
大数据·数据库·数据分析
曼岛_1 小时前
[图解密码学]第4章 古典密码
java·数据库·密码学
瀚高PG实验室2 小时前
HGDB V9.0.5 .pgpass 免密登录提示 IsEncryptNon-base64 encoding 警告处理
数据库·postgresql·瀚高数据库
龙腾AI白云3 小时前
大模型检索增强生成(RAG)的技术原理与架构设计
数据库·python·机器学习·知识图谱
KaiwuDB3 小时前
KaiwuDB 运维实战06:数据库备份与恢复:从理论到实战
运维·数据库·时序数据库·kaiwudb
数字新视界3 小时前
空调控制器AIRC800的智能化管理与应用实践
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
学IT的周星星4 小时前
LangGraph:用「流程图」的方式编排 Agent
数据库·人工智能·大模型·llm·流程图·agent