2013-02-14 2 views

ответ

2

Вот небольшой скрипт, который производит 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; 

Делитесь и наслаждайтесь.

+0

Спасибо! Модифицированная версия этого решения решила мое требование. [Cade's] (http://stackoverflow.com/users/1083652/a-b-cade) ответ был также прекрасен, но это лучше подходит для моего использования. В запросе есть ошибка. Вы использовали select *. Это должны быть имена столбцов внутреннего запроса – rajesh

5

Вы можете попробовать:

SELECT object_name, argument_name, in_out, data_type 
FROM user_arguments; 

Или all_arguments, если у вас есть привилегии

Смежные вопросы