带有绑定变量的动态sql

时间:2014-11-20 18:10:07

标签: sql oracle stored-procedures dynamic sys-refcursor

/
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行 - “表名无效”

1 个答案:

答案 0 :(得分:1)

您不能使用绑定变量来代替标识符,例如表名或列名。解析语句时必须知道这些事情,这在绑定变量绑定到值之前发生。 (使用绑定变量的整个目的的一部分是能够解析一个语句,然后用变量值执行它。)

在这种情况下,解决方案很简单,因为您已经将查询字符串放入变量中。

BEGIN
SQL_QRY:='SELECT EMPNO,' || p_col || ' FROM ' || p_table;
--DBMS_OUTPUT.PUT_LINE('SQL:'||SQL_QRY);
OPEN SEARCH_RESULT FOR SQL_QRY;