绑定变量不存在动态 SQL

bind variable does not exist with dynamic SQL

我正在玩动态 sql 和 pl/sql,我的想法是至少为小尺寸表格的行创建通用打印程序。为了让程序正常工作,我需要找到某些列的值,所以我涉及动态 sql。查找数据的函数有这样的代码:

function find_value(p_table_name string, p_id_name string, p_id string, p_field string) 
return varchar2
as
rresult varchar2(50) := '';
query_str varchar2(200);
type cur_typ is ref cursor;
c cur_typ;
inv_num number;
begin
  query_str := 'select '||p_field||' from '||p_table_name||' where '||p_id_name||' = '||p_id;
  open c for query_str using inv_num;
  loop
    fetch c into rresult;
    exit when c%notfound;
  end loop;
  close c;
  return to_char(rresult);
end; 

我得到的错误是:

Error starting at line : 2 in command - BEGIN --PROBNI_RED := JOB_PKG.GET_EMPLOYEE(100);
PPRINT.PRINT('EMPLOYEES','EMPLOYEE_ID',100); END; Error report - ORA-01006: bind variable does not exist ORA-06512: at "ORA01.PPRINT", line 14 ORA-06512: at "ORA01.PPRINT", line 44 ORA-06512: at line 3 01006. 00000 - "bind variable does not exist" *Cause:
*Action:

我今天第一次使用动态SQL,所以我想它可能有点小。

我删除了

using inv_num;

它开始起作用了。

尝试在动态查询中使用您的变量:p_id

query_str := 'select '||p_field||' from '||p_table_name||' where '||p_id_name||' = :p_id';

如果你想使用using inv_num

错误意味着您的 using 子句告诉它使用 inv_num 但它无处可去。例如,这给出了您看到的错误:

declare
    some_var varchar2(1) := 'X';
begin
    execute immediate 'select * from dual' using some_var;
end;

ORA-01006: bind variable does not exist
ORA-06512: at line 4

您可以使用带有绑定变量的 using 子句,如下所示:

declare
    some_var varchar2(1) := 'X';
begin
    execute immediate 'select * from dual where dummy = :b1' using some_var;
end;

或者您可以传递文字值:

begin
    execute immediate 'select * from dual where dummy = :b1' using 'X';
end;

(这个演示实际上没有做任何事情,因为它不处理动态查询的输出 - 它只是为了演示语法。)

请注意,动态 SQL 中的 :b1 等绑定只是位置占位符,名称与调用 PL/SQL 中的任何变量或参数无关,因此将它们命名为它们(例如 :p_id)可能会引起混淆,即使语法完全有效。