Динамический sql с переменной связывания
/
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;
/
Я пытаюсь вернуть empno и имя сотрудника, используя процедуру, которая содержит динамически построенный SQL-запрос. Запрос создается с помощью bind variables.but, получая следующую ошибку. Возможно, что-то не так с тем, как я вызываю процедуру ORA-06512: в строке 1 00903. 00000 - "неверное имя таблицы"
1 ответ
Вы не можете использовать переменные связывания для замены идентификаторов, таких как имена таблиц или столбцов. Эти вещи должны быть известны во время синтаксического анализа оператора, что происходит до того, как переменные связывания будут связаны со значениями. (Часть всей цели использования переменных связывания состоит в том, чтобы иметь возможность проанализировать инструкцию один раз и затем выполнить ее со значениями переменной.)
В этом случае решение простое, поскольку вы уже помещаете строку запроса в переменную.
BEGIN
SQL_QRY:='SELECT EMPNO,' || p_col || ' FROM ' || p_table;
--DBMS_OUTPUT.PUT_LINE('SQL:'||SQL_QRY);
OPEN SEARCH_RESULT FOR SQL_QRY;