sql >> Databasteknik >  >> RDS >> Oracle

Hämta en lista över privata procedurer/funktioner från en paketkropp

Naturen för privata tillställningar är att de är privata. Det finns inga dataordboksvyer som exponerar dem som standard. USER_PROCEDURES och USER_ARGUMENTS visar endast information för offentliga procedurer (de som definieras i en paketspecifikation0.

Vi kan dock få information om dem med PL/SCOPE, men att göra det kräver lite extra ansträngning:

  1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
  2. SQL> alter package your_package compile body;

Nu kan du hitta dina privata programenheter med denna fråga:

select ui.type, ui.name, ui.usage_id
from user_identifiers ui
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DEFINITION'
and ui.type in ('PROCEDURE', 'FUNCTION')
minus
( select 'PROCEDURE', upr.procedure_name 
  from user_procedures upr
  where upr.object_name = 'YOUR_PACKAGE'
  union
  select 'FUNCTION', uarg.object_name
  from user_arguments uarg
  where uarg.package_name = 'YOUR_PACKAGE'
  and uarg.position = 0 
);

För att få argumenten för en privat procedur anslut USAGE_ID från den föregående frågan till den här frågan:

select ui.name
       , ui.type
       , ui.usage_id
       , ui2.type as param_datatype
from user_identifiers ui
     left join user_identifiers ui2
        on ui2.usage_context_id = ui.usage_id 
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DECLARATION'
and ui.usage_context_id = :private_proc_usage_id
/

Detta måste vara en vänsterkoppling eftersom user_identifiers har datatypposter för skalära datatyper (tecken, nummer, datum, clob) men inte komplexa datatyper (xmltype, användardefinierade typer).

Vi kan få massor av information om procedurer från PL/SCOPE, även om det inte är så lätt som att fråga efter USER_PROCEDURES eller USER_ARGUMENTS (i själva verket är det förvånansvärt klumpigt). Få reda på mer. Var medveten om att PL/SCOPE-data lagras på SYSAUX-tabellutrymmet, så kom inte i varmt vatten med din DBA!




  1. MySQL Event Scheduler på en viss tid varje dag

  2. Mysql-händelsefel med php

  3. ALTER TABLE i MySQL:Vän eller fiende?

  4. Trunkera alla tabeller i en MySQL-databas med ett kommando?