Получение описаний объектов ORACLE

Предположим, у меня есть ORACLE-схема, содержащая пакет. Этот пакет определяет типы, функции, процедуры и т. Д .:

CREATE PACKAGE... DECLARE FUNCTION ... PROCEDURE ... END; 

Есть ли запрос, который я могу выполнить, чтобы получить определения этих отдельных объектов без пакета упаковки?

Если вам нужны процедуры / функции пакета, вы можете использовать user_procedures :

 Create Package package_test As Procedure dummy( x In Number ); Function dummy2 Return Number; End package_test; 

Выберите object_name, procedure_name Из user_procedures Где object_name = 'PACKAGE_TEST';

возвращается

 PACKAGE_TEST DUMMY PACKAGE_TEST DUMMY2 PACKAGE_TEST 

Чтобы получить параметры, выберите из user_arguments .


Если вам нужен код для ваших пакетов / процедур / функций, используйте user_source для объектов вашего пользователя, all_source для объектов, для которых у вас есть гранты, и dba_source для всех объектов:

 Select * From user_source Where name = 'YOUR_TEST' And type = 'PROCEDURE'; 

Если вы создали процедуру your_test до:

 Create Procedure your_test As Begin dbms_output.put_line('test'); End your_test; 

он возвращается

 YOUR_TEST PROCEDURE 1 Procedure your_test As YOUR_TEST PROCEDURE 2 Begin YOUR_TEST PROCEDURE 3 dbms_output.put_line('test'); YOUR_TEST PROCEDURE 4 End your_test; 

Из словаря данных можно получить подписи отдельных методов. Соответствующим представлением является USER / ALL / DBA_ARGUMENTS.

Есть пара коряг, на которые нужно следить. Если аргумент имеет постулирование 0, это возвращаемое значение функции не является параметром. Если этот параметр является сложным типом (например, вложенной таблицей или PL / SQL-записью), он будет отображаться несколько раз, при этом каждый уровень будет увеличивать уровень data_level .

Следующий запрос объединяет аргументы с их собственными процедурами. Я исключаю записи в USER_PROCEDURES на уровне пакета (то есть subprogram_id subprogram_id=0 ) и записи в USER_ARGUMENTS для более низких уровней complex_type (то есть data_level > 0 ). Запрос также обрабатывает процедуры без каких-либо параметров.

 SQL> select o.object_type 2 , case 3 when o.object_type in ( 'PACKAGE', 'TYPE') then p.object_name 4 else null 5 end as object_name 6 , case 7 when o.object_type in ( 'PACKAGE', 'TYPE') then p.procedure_name 8 else p.object_name 9 end as procedure_name 10 , case 11 when a.position != 0 then a.argument_name 12 when a.position = 0 then '** return value **' 13 else null 14 end as argument_name 15 , a.data_type 16 from user_arguments a 17 , user_procedures p 18 , user_objects o 19 where o.object_type in ( 'PACKAGE', 'TYPE', 'FUNCTION', 'PROCEDURE') 20 and p.object_name = o.object_name 21 and p.subprogram_id != 0 22 and a.object_id (+) = p.object_id 23 and a.subprogram_id (+) = p.subprogram_id 24 and a.data_level(+) = 0 25 order by o.object_type, o.object_name, p.subprogram_id, a.position 26 / OBJECT_TYPE OBJECT_NAME PROCEDURE_NAME ARGUMENT_NAME DATA_TYPE ------------------- ------------------------------ ------------------------------ ------------------------------ ------- FUNCTION COMPARE_OBJECTS ** return value ** PL/SQL BOOLEAN FUNCTION COMPARE_OBJECTS OBJ1 UNDEFINED FUNCTION COMPARE_OBJECTS OBJ2 UNDEFINED FUNCTION GET_EMPS ** return value ** REF CURSOR FUNCTION GET_EMPS P_ARGS UNDEFINED FUNCTION STR_TO_NUMBER_TOKENS ** return value ** TABLE FUNCTION STR_TO_NUMBER_TOKENS P_STRING VARCHAR2 FUNCTION STR_TO_NUMBER_TOKENS P_SEPARATOR VARCHAR2 PACKAGE P23 POP_ARRAY ** return value ** TABLE PACKAGE P23 POP_ARRAY P_NO NUMBER PACKAGE P23 INS_TABLE P_ARRAY TABLE PROCEDURE CHANGE_EMP_SAL P_ENO NUMBER PROCEDURE CHANGE_EMP_SAL P_NEW_SAL NUMBER PROCEDURE PRINTE TYPE NEW_EMP EQUALS ** return value ** RAW TYPE NEW_EMP EQUALS SELF OBJECT 22 rows selected. SQL> 

Я мог бы выбрать другую полезную информацию из USER_ARGUMENTS, такой как IN_OUT, или параметр DEFAULTED, но я решил, что он уже достаточно прокручивается.