2016-04-14 11 views
6

%ROWTYPE引数を使用するPLSQLプロシージャの実際の署名を取得するにはどうすればよいですか?例えば%ROWTYPEで実際の署名を取得する方法

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; 

が与える:ALL_ARGUMENTSでそう

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

を、 'INPUT_SAMPLE' 'は、サンプルの%のROWTYPE' へのリンクがない 'PL/SQLのRECORD' として示されています。 DBA_PLSQL_TYPESにはこのタイプのトレースはありません。

このプロシージャの宣言された型をこの形式で取得するにはどうすればよいですか?

GETSAMPLE INPUT_SAMPLE IN SAMPLES%ROWTYPE 

答えて

0

私は辞書を検索して何も見つかりませんでした。

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

:)正規表現でいくつかの教祖は私の正規表現式を確認してみましょう:何の情報は(私は知らない)が存在しない場合は、のようなものを使用することができます。実際には、引数名も正規表現にする必要があります。

+0

私は、すべてのパッケージが具体的なスタイルで動作するなら、この考え方はうまくいくと考えています。他のケースでは、私たちはすべての可能なオプションをサポートすることはできません –

+0

私はそれを実際に答えにしませんが、コードはコメントでひどく見えます。 – Mottor

+0

これは本当にシンプルなユースケースのためにしか機能しません。例えば。 1) '%ROWTYPE'演算子は新しい行に置くことができます、2)表は別のスキーマからの同義語/完全修飾型であることができます3)'%ROWTYPE'は別の 'RECORD' 'など –

0

私は他の方法でラウンドに行くことをお勧めすることができます)

1のすべては、あなたのテーブル

2に必要な属性を持つオブジェクト型を作成する)あなたのタイプ

3のオブジェクト表を作成します)引数を渡しますあなたTYPE

4)のお手続きにあなたはALL_ARGUMENTS

%rowtypeとから型名を取得することができますは、コンパイル時に動的に解決される擬似型です。では、この場合、data_dictionary情報にどのような情報が表示されると思いますか?サンプル%rowtypeに関連する名前付きレコード/型/オブジェクトはありません。

+0

この回答には直接関係しませんが、あなたのプロフィールのURLを確認してください。そのウェブサイトがハイジャックされているようです。私は訪問するとスパムサイトに転送されます。 –

関連する問題