2016-07-04 3 views
-2
CREATE OR REPLACE FUNCTION XXCHR_FNC(
    P_EMP_ID   IN NUMBER, 
    P_COLUMN_NAME IN VARCHAR2 
) RETURN VARCHAR2 
IS 
    lv_dyn_sql VARCHAR2(2000):= NULL; 
    lv_return_val VARCHAR2(200); 
BEGIN 
    lv_dyn_sql:='SELECT :2 FROM thirty_days ' 
       || 'WHERE salesrep_id=:1'; 

    EXECUTE IMMEDIATE lv_dyn_sql INTO lv_return_val 
    USING P_EMP_ID,P_COLUMN_NAME; 

    RETURN(lv_return_val); 
EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line('Returning Error : '||SQLERRM); 
    RETURN (SQLERRM); 
END XXCHR_FNC; 
+0

何の質問がここにはありません。何を聞いていますか? – MT0

+0

申し訳ありませんが、私は上記の関数を実行しようとすると、私はORA-01722のようなエラーに直面している:テーブルからデータを選択中に番号のエラーが無効です。変数に正しいデータ型を割り当てて、ここで提案してください。事前に感謝します – Satish

+0

'salesrep_id'カラムのタイプは何ですか? 'P_COLUMN_NAME'パラメータにどのような価値を渡しましたか?私は 'salesrep_id'が数値データ型であると思いますが、数値に変換できない文字列を' P_COLUMN_NAME'に渡しました。これがエラーの原因でした。 – krokodilko

答えて

0

バインド変数として列名を渡すことはできません。値を取得するのではなく、列名を文字列リテラルとして戻します。列。あなたは、SQL文字列に連結を使用する必要があります。

CREATE OR REPLACE FUNCTION XXCHR_FNC(
    P_EMP_ID   IN NUMBER, 
    P_COLUMN_NAME IN VARCHAR2 
) RETURN VARCHAR2 
IS 
    lv_return_val VARCHAR2(200); 
BEGIN 
    EXECUTE IMMEDIATE 
    'SELECT ' || P_COLUMN_NAME || ' FROM thirty_days WHERE salesrep_id=:1' 
    INTO lv_return_val 
    USING P_EMP_ID; 

    RETURN lv_return_val; 
EXCEPTION 
    WHEN OTHERS THEN 
    dbms_output.put_line('Returning Error : '||SQLERRM); 
    RETURN SQLERRM; 
END XXCHR_FNC; 
/

テスト

CREATE TABLE thirty_days (
    salesrep_id NUMBER(8,0), 
    a VARCHAR2(20), 
    b VARCHAR2(20), 
    c VARCHAR2(20), 
    d VARCHAR2(20) 
); 

INSERT INTO thirty_days VALUES(1, 'a', 'b', 'c', 'd'); 

出力

SELECT xxchr_fnc(1, 'a') FROM DUAL; 

XXCHR_FNC(1,'A') 
---------------- 
a 
+0

ありがとうMT0その作業:) – Satish

関連する問題