2016-04-14 29 views
6

Come ottenere la firma reale per una procedura PLSQL che utilizza gli argomenti% ROWTYPE?Come ottenere la firma reale con% ROWTYPE

Ad esempio:

clear screen; 
prompt > Table creation to support %ROWTYPE 
create table samples (
    id number, 
    code varchar2(15), 
    lib varchar2(200)); 

prompt > Package witch use %ROWTYPE 
create or replace package use_samples as 
    procedure getSample(input_sample samples%ROWTYPE); 
end use_samples; 
/
prompt > Package BODY witch use %ROWTYPE 
create or replace package body use_samples as 
    procedure getSample(input_sample IN samples%ROWTYPE) is 
    ex samples%ROWTYPE; 
    begin 
    select * into ex from samples where samples.code = input_sample.code; 
    end getSample; 
end use_samples; 
/

prompt > Proc arguments by ALL_ARGUMENTS 
set pagesize 50000 
set linesize 2000 
set verify off 
CLEAR COLUMNS; 
COLUMN object_name HEADING "PROC" FORMAT A30 JUSTIFY LEFT; 
COLUMN argument_name HEADING "ARGUMENT_NAME" FORMAT A30 JUSTIFY LEFT; 

select object_name, argument_name, in_out, data_level, position, data_type 
from all_arguments 
where owner = USER 
and package_name = 'USE_SAMPLES' 
and object_name = 'GETSAMPLE'; 

prompt >> Argument 'INPUT_SAMPLE' is shown as 'PL/SQL RECORD' without any link to 'samples%ROWTYPE' 

prompt > PLSQL types declared 
select * 
from DBA_PLSQL_TYPES 
where owner = USER 
and package_name = 'USE_SAMPLES'; 

prompt >> There is no declared type because we use directly a %ROWTYPE argument 


prompt > Clean up 
drop package use_samples; 
drop table samples; 

dà:

> Table creation to support %ROWTYPE 

Table SAMPLES created. 

> Package witch use %ROWTYPE 

Package USE_SAMPLES compiled 

> Package BODY witch use %ROWTYPE 

Package body USE_SAMPLES compiled 
> Proc arguments by ALL_ARGUMENTS 
columns cleared 

PROC       ARGUMENT_NAME     IN_OUT DATA_LEVEL POSITION DATA_TYPE      
------------------------------ ------------------------------ --------- ---------- ---------- ------------------------------ 
GETSAMPLE      INPUT_SAMPLE     IN     0   1 PL/SQL RECORD     
GETSAMPLE      ID        IN     1   1 NUMBER       
GETSAMPLE      CODE       IN     1   2 VARCHAR2      
GETSAMPLE      LIB       IN     1   3 VARCHAR2      

>> Argument 'INPUT_SAMPLE' is shown as 'PL/SQL RECORD' without any link to 'samples%ROWTYPE' 
> PLSQL types declared 
no rows selected 


>> There is no declared type because we use directly a %ROWTYPE argument 
> Clean up 

Package USE_SAMPLES dropped. 


Table SAMPLES dropped. 

Quindi, con ALL_ARGUMENTS, 'INPUT_SAMPLE' è indicato come 'PL/SQL RECORD' senza alcun collegamento a 'campioni% ROWTYPE'. E non c'è traccia di questo tipo in DBA_PLSQL_TYPES.

Come posso ottenere il tipo dichiarato di questa procedura in questo modulo?

GETSAMPLE INPUT_SAMPLE IN SAMPLES%ROWTYPE 

risposta

0

Ho cercato nel dizionario e non ho trovato nulla. Se non ci sono informazioni (non so), è possibile utilizzare qualcosa di simile:

SELECT b.object_name,b.argument_name, REGEXP_SUBSTR (UPPER (text),'([^{ ,(;}]+)%ROWTYPE') tadaaa 
    FROM user_source a 
     JOIN (SELECT package_name, object_name, argument_name, in_out, data_level, position, data_type 
       FROM user_arguments x 
       WHERE data_type = 'PL/SQL RECORD' AND package_name = 'USE_SAMPLES' AND object_name = 'GETSAMPLE') b 
      ON a.name = b.package_name 
WHERE a.TYPE = 'PACKAGE BODY' 
    AND UPPER (text) LIKE '%\%ROWTYPE%' ESCAPE '\' 
    AND UPPER (text) LIKE '%'||UPPER(ARGUMENT_NAME)||'%'  

:) Lasciate qualche guru in regex controllare la mia espressione regex. In realtà anche il nome dell'argomento deve essere in regex.

+0

Suppongo che questa idea funzionerà se tutti i pacchetti funzioneranno in modo concreto. In altri casi, non siamo in grado di supportare tutte le possibili opzioni –

+0

Non lo metterei in realtà come risposta, ma il codice appare orribile nei commenti. – Mottor

+0

Funziona davvero solo per i casi d'uso più semplici. Per esempio. 1) l'operatore '% ROWTYPE' può essere messo su una nuova riga, 2) la tabella potrebbe essere un sinonimo/pienamente qualificato da un altro schema, 3) il'% ROWTYPE' potrebbe essere un tipo 'RECORD' annidato in un altro' RECORD ', ecc. –

0

posso suggerire di andare viceversa:

1) creare il tipo di oggetto con tutti gli attributi il ​​necessario nella tabella

2) creare la tabella oggetto del vostro tipo

3) passano argomento in te procedura del vostro tipo

4) è possibile ottenere il nome tipo da all_arguments

%rowtype e %type sono pseudo-tipi risolti dinamicamente durante la compilazione. Quindi cosa ti aspetteresti di vedere in informazioni data_dictionary in questo caso? Non esiste un record/tipo/oggetto denominato correlato al campione% rowtype.

+0

Non direttamente correlati a questa risposta, ma controlla l'URL sul tuo profilo. Sembra che il sito web sia stato dirottato. Vengo inoltrato a siti di spam quando lo visito. –