【问题标题】:Getting a list of functions and procedure signature from oracle从 oracle 获取函数列表和过程签名
【发布时间】:2013-01-30 08:05:35
【问题描述】:

是否有任何查询可以为我提供函数/过程的签名详细信息。我正在查看返回类型、函数名、参数类型,是否为 IN/OUT/INOUT。

我知道this 线程,但它只提供名称

【问题讨论】:

    标签: oracle stored-procedures plsql


    【解决方案1】:

    这是一个生成 PL/SQL 函数原型的小脚本:

    DECLARE 
      -- Local variables here
      strPrev_object          VARCHAR2(30);
      strReturn_type          VARCHAR2(30);
      strProcedure_definition VARCHAR2(32767);
    BEGIN
      -- This dumps out subprogram definitions.  It doesn't try to build
      -- package scripts; instead, it dumps the package procedures as though they were defined
      -- individually, with package name preceding subprogram name.
    
      FOR aRow IN (SELECT *
                     FROM USER_ARGUMENTS a
                     INNER JOIN (SELECT PACKAGE_NAME, OBJECT_NAME, MAX(SEQUENCE) AS MAX_SEQUENCE
                                   FROM USER_ARGUMENTS
                                   GROUP BY PACKAGE_NAME, OBJECT_NAME)
                       USING (PACKAGE_NAME, OBJECT_NAME)
                     WHERE PACKAGE_NAME IS NULL AND
                           OBJECT_NAME = '<your package, procedure, or function>'
                     ORDER BY PACKAGE_NAME, OBJECT_NAME, SEQUENCE)
      LOOP
        strProcedure_definition := NULL;
    
        IF strPrev_object IS NOT NULL AND
           strPrev_object <> aRow.OBJECT_NAME 
        THEN
          IF strReturn_type IS NULL THEN
            DBMS_OUTPUT.PUT_LINE('     );');
          ELSE
            DBMS_OUTPUT.PUT_LINE('     ) RETURN ' || strReturn_type || ';');
          END IF;
    
          DBMS_OUTPUT.PUT_LINE('');
        END IF;
    
        IF aRow.SEQUENCE = 1 THEN
          IF aRow.ARGUMENT_NAME IS NULL THEN
            strProcedure_definition := 'FUNCTION ';
            strReturn_type := aRow.DATA_TYPE;
          ELSE
            strProcedure_definition := 'PROCEDURE ';
            strReturn_type := NULL;
          END IF;
    
          IF aRow.PACKAGE_NAME IS NOT NULL THEN
            strProcedure_definition := strProcedure_definition || aRow.PACKAGE_NAME || '.' || aRow.OBJECT_NAME || '(';
          ELSE
            strProcedure_definition := strProcedure_definition || aRow.OBJECT_NAME || '(';
          END IF;
    
          DBMS_OUTPUT.PUT_LINE(strProcedure_definition);
        END IF;
    
        IF aRow.ARGUMENT_NAME IS NOT NULL THEN
          DBMS_OUTPUT.PUT_LINE('     ' || aRow.ARGUMENT_NAME || '  ' ||
                               CASE aRow.IN_OUT WHEN 'IN/OUT' THEN 'IN OUT' ELSE aRow.IN_OUT END || '  ' ||
                               aRow.DATA_TYPE || CASE WHEN aRow.SEQUENCE <> aRow.MAX_SEQUENCE THEN ',' ELSE '' END
                               );
        END IF;
    
        strPrev_object := aRow.OBJECT_NAME;
      END LOOP;  -- aRow
    
      IF strReturn_type IS NULL THEN
        DBMS_OUTPUT.PUT_LINE('     );');  
      ELSE
        DBMS_OUTPUT.PUT_LINE(') RETURN ' || strReturn_type || ';');
      END IF;
    END;
    

    分享和享受。

    【讨论】:

    • 谢谢!这个的修改版本已经解决了我的要求。 Cade's 答案也很好,但这更适合我的用例。查询中有错误。您已经使用了选择 *。它应该是内部查询的列名
    【解决方案2】:

    你可以试试:

    SELECT object_name, argument_name, in_out, data_type
    FROM user_arguments;
    

    或者all_arguments,如果你有权限的话

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多