2017-12-27 13 views
0

ユーザ入力パラメータを持つプロシージャがあるとします。パラメータを含むPl SQLカーソル

Create procedure Match_Record(v_match_ID) 

Cursor match is 
Select * 
From table A 
Where not exists(select ‘bbb’ from table B 
           Where a. v_match_ID = b. v_match_ID); 

v_match_IDが有効な識別子ではないため、コンパイルされません。

ここで唯一のオプションはすぐ実行されますか?

+2

ここに列名またはリテラルを渡そうとしていますか? 'V_MATCH_ID'が列名であればyes、execute immediate(またはDBMS_SQL)を使用する必要があります。 – Ben

+0

@Benはい、私は列名を渡そうとしています。 – dozel

+0

あなたがやっていることがたくさんあるので、これを複製するにはどうすればよいか分かりませんが、関連するものがいくつかあります。https://stackoverflow.com/q/12956627/458741、https:// stackoverflow.com/q/15786953/458741、https://stackoverflow.com/q/25182858/458741 – Ben

答えて

1

は、はい、あなたは、動的SQLを使用する必要があり、その場合には

「私は、列名を渡すためにしようとしています」。おそらくexecute immediateではなく、おそらくカーソル変数を開く必要があります。

Create procedure Match_Record(v_match_ID) 
    ... 
    rc sys_refcursor; 
begin 
    open rc for 
     'Select * 
     From table A 
     Where not exists(select blah from table B 
          Where a.'||v_match_ID||' = b.'|| v_match_ID||')'; 
関連する問題