2016-04-14 14 views
6

Jak uzyskać prawdziwy podpis dla procedury PLSQL, która używa% argumentów ROWTYPE?Jak uzyskać prawdziwy podpis za pomocą% ROWTYPE

Na przykład:

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; 

daje:

> 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. 

Więc z ALL_ARGUMENTS 'INPUT_SAMPLE' jest pokazana jako 'PL/SQL RECORD' bez żadnego związku z 'próbek% ROWTYPE'. I nie ma śladu tego typu w DBA_PLSQL_TYPES.

Jak uzyskać deklarowany typ tej procedury w tym formularzu?

GETSAMPLE INPUT_SAMPLE IN SAMPLES%ROWTYPE 

Odpowiedz

0

Szukałem w słowniku i nic nie znalazłem. Jeżeli nie ma informacji (nie wiem), można użyć coś takiego:

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)||'%'  

:) Niech jakiś guru w regex sprawdź mój wyraz regex. W rzeczywistości nazwa argumentu musi być również w regex.

+0

Przypuszczam, ten pomysł zadziała, jeśli wszystkie pakiety będą działać w konkretnym stylu. W innym przypadku nie możemy obsłużyć wszystkich możliwych opcji. –

+0

Nie powiedziałbym tego w rzeczywistości jako odpowiedzi, ale kod wygląda okropnie w komentarzach. – Mottor

+0

To naprawdę działa tylko w najprostszych przypadkach. Na przykład. 1) operator '% ROWTYPE' może zostać umieszczony na nowej linii, 2) tabela może być synonimem/pełna kwalifikacja z innego schematu, 3)'% ROWTYPE' może być zagnieżdżonym typem 'RECORD' w innym' RECORD ', itp. –

0

mogę zaproponować, aby przejść odwrót:

1) utworzyć typ obiektu ze wszystkich atrybutów trzeba w tabeli

2) Utwórz obiekt tabeli na typ

3) przekazać argumentu Into you procedury twój typ

4) można uzyskać nazwę typu z all_arguments

%rowtype i %type są pseudo-typy dynamicznie rozwiązywane podczas kompilacji. Czego więc można się spodziewać w info_dictionary info w tym przypadku? Nie ma nazwanego rekordu/typu/obiektu związanych z próbką% rowtype.

+0

Nie ma bezpośredniego związku z tą odpowiedzią, ale sprawdź adres URL w swoim profilu. Wygląda na to, że ta strona została przejęta. Zostaję przekierowany do stron ze spamem, gdy go odwiedzę. –

Powiązane problemy