【问题标题】:How to select all the stored procedures from Oracle database with one statement?如何用一条语句从 Oracle 数据库中选择所有存储过程?
【发布时间】:2019-02-02 14:10:59
【问题描述】:

我想在 Oracle 数据库中查看所有fooUser 拥有的存储过程实现。

通过使用rownum,我可以为dba_objects 表中的第一个过程执行此操作,但fooUser 拥有的dba_objects 表中有许多过程。

我不想编写存储过程来实现这一点,我想用一条 SQL 语句来做到这一点。

查询以获取第一个存储过程实现:

SELECT 
    line, text
FROM 
    dba_source
WHERE
    name = (SELECT object_name 
            FROM dba_objects 
            WHERE object_type = 'PROCEDURE' 
              AND owner = 'fooUser' AND rownum = 1) 
    AND type = 'PROCEDURE'
ORDER BY 
    line

【问题讨论】:

    标签: sql oracle select


    【解决方案1】:

    要获取程序源,您可以使用dbms_metadata.get_ddl

    在此处查看文档dbms_metadata

    例如,下面的脚本会为您返回所有者为 usr1 的每个过程的过程列表和源

    select object_name
         , dbms_metadata.get_ddl(object_type,object_name) from dba_procedures
      where owner = 'USR1'
        and object_type = 'PROCEDURE'
    

    如果您只需要所有程序的逐行文本

    SELECT line, text
    FROM dba_source
    WHERE owner = 'SCM'
      AND type = 'PROCEDURE'
    ORDER BY name, line
    

    【讨论】:

    • 我在dbms_metadata 上收到ORA-00904: : invalid identifier。我不想在这个数据库上安装任何包,只想要一个原生的 Oracle 解决方案。
    • 这是标准的 oracle 包,至少 10g 版本。为您的用户添加权限:grant execute on dbms_metadata to my_user
    • 当我尝试授予权限时,我收到错误ORA-00942: table or view does not exist。我正在运行 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
    • 看来该用户没有dba_proceduresdbms_metadata的权限尝试以sys用户身份连接
    【解决方案2】:

    试试这个:

    SELECT line, text
    FROM dba_source
    WHERE owner = ?
      AND name = ?
      AND type = 'PROCEDURE'
    ORDER BY line
    

    更新 #1:

    SELECT line, text
    FROM dba_source
    WHERE owner = 'foouser'
      AND type = 'PROCEDURE'
    ORDER BY line
    

    更新 #2:

       SELECT line, text, name
        FROM dba_source
        WHERE owner = 'foouser'
          AND type = 'PROCEDURE'
        ORDER BY name, line
    

    【讨论】:

    • 这就是我正在做的事情,这就是为什么它适用于 1 个存储过程(我用 dba_objects 上的 select 语句替换了你的第二个 ? 并删除了你的第一个 ? 因为不需要)。我需要 fooUser 拥有的dba_objects 中的所有存储过程实现
    • 我对为什么需要子选择有点困惑?如果它们归 foouser 所有,则应返回所有过程。我更新了我的答案以反映这一点。
    • 当我运行你的更新 #1 时,由于我是按行排序,我从所有存储过程中获取第 1 行,然后从所有存储过程中获取第 2 行。我需要第一个完整的 SP,然后是第二个完整的 SP....这就是为什么我认为需要子选择。
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多