0
/
create or replace procedure search_proc(p_string varchar2,p_table varchar2,p_col varchar2,search_result OUT sys_refcursor)
is
SQL_QRY VARCHAR2(2000);
BEGIN
SQL_QRY:='SELECT EMPNO,:1 FROM :2';
--DBMS_OUTPUT.PUT_LINE('SQL:'||SQL_QRY);
OPEN SEARCH_RESULT FOR SQL_QRY  USING p_col,p_table;
END;

/

VARIABLE REFC REFCURSOR;
EXEC SEARCH_PROC('TEST','EMP','ENAME',:REFC);
PRINT REFC;

/

動的に構築された SQL クエリを含むプロシージャを使用して、empno と従業員名を返そうとしています。クエリはバインド変数を使用して構築されていますが、次のエラーが発生します。プロシージャ ORA-06512 を呼び出す方法に問題がある可能性があります。 1 行目 00903.00000 - 「無効なテーブル名」

4

1 に答える 1

1

テーブル名や列名などの識別子の代わりにバインド変数を使用することはできません。これらのことは、バインド変数が値にバインドされる前に発生するステートメントの解析時に認識されている必要があります。(バインド変数を使用する全体的な目的の一部は、ステートメントを一度解析してから変数値で実行できるようにすることです。)

この場合、すでにクエリ文字列を変数に入れているので、解決策は簡単です。

BEGIN
SQL_QRY:='SELECT EMPNO,' || p_col || ' FROM ' || p_table;
--DBMS_OUTPUT.PUT_LINE('SQL:'||SQL_QRY);
OPEN SEARCH_RESULT FOR SQL_QRY;
于 2014-11-20T18:20:08.473 に答える