2009-05-21 15 views
2

私は次のようにシグネチャを持つ関数の束を持っている:EXECUTE IMMEDIATEを使用してレコードを取得する方法は?

FUNCTION func1 (par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec; 

と、私はこの関数の束からデータを取得するための機能があります。

FUNCTION get_result (func_name IN VARCHAR2, par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec; 
IS 
    rec1 my_rec; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT ' || func_name || '(:par1, :par2) FROM DUAL' 
    INTO rec1 
    USING IN par1, IN par2; 

    RETURN rec1; 
END; 

をしかし、このコードは、ORA-01007「変数で失敗します選択リストには含まれていません。
声明を書き換えるにはどうすればよいですか?

答えて

2

それはすべて私はあなたの関数定義(最初の行に不要なセミコロン)での構文エラーを訂正1、(オラクル10G)私のために正常に動作します:

SQL> create type my_rec is object (id integer, name varchar2(30)) 
    2/

Type created. 

SQL> create FUNCTION func1 (par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec 
    2 is 
    3 l_rec my_rec := my_rec (1, 'x'); 
    4 begin 
    5  return l_rec; 
    6 end; 
    7/


Function created. 

SQL> CREATE OR REPLACE 
    2 FUNCTION get_result (func_name IN VARCHAR2, par1 IN VARCHAR2, par2 IN NUMBER) RETURN my_rec 
    3 IS 
    4  rec1 my_rec; 
    5 BEGIN 
    6  EXECUTE IMMEDIATE 'SELECT ' || func_name || '(:par1, :par2) FROM DUAL' 
    7  INTO rec1 
    8  USING IN par1, IN par2; 
    9  RETURN rec1; 
10 END; 
11/

Function created. 

SQL> select get_result ('func1',1,2) from dual; 

GET_RESULT('FUNC1',1,2)(ID, NAME) 
------------------------------------------------- 
MY_REC(1, 'x') 
+1

オブジェクト型としてmy_recを定義しても動作しますが、my_recがパッケージのレコード型として定義されていると動作しません。理由は何ですか? – engro

+0

@ negr-o、パッケージのレコード・タイプはPL/SQL内でのみ認識されますが、SQLでは使用できません。 – tuinstoel

+0

2 tuinstoel:ありがとう! – engro

0

func_nameのようにクエリに連結できます。

+0

あなたは何を意味した:CONCATENATE値を'USING'句を使用する代わりに動的SQL文字列を持つ変数の – engro

+0

はい。 par1とpar2が "安全な"文字列ではない場合のセキュリティホールだと私は認めます。 – ATorras

関連する問題