动态 SQL 不存在绑定变量

Posted

技术标签:

【中文标题】动态 SQL 不存在绑定变量【英文标题】:bind variable does not exist with dynamic SQL 【发布时间】:2017-08-22 12:27:35 【问题描述】:

我正在使用动态 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; 

我得到的错误是:

从第 2 行开始的错误命令 - BEGIN --PROBNI_RED := JOB_PKG.GET_EMPLOYEE(100); PPRINT.PRINT('EMPLOYEES','EMPLOYEE_ID',100);结尾;错误报告 - ORA-01006: 绑定变量不存在 ORA-06512: 在 "ORA01.PPRINT", 第 14 行 ORA-06512:在“ORA01.PPRINT”,第 44 行 ORA-06512:在第 3 行 01006. 00000 - “绑定变量不存在” *原因: *行动:

我今天是第一次真正使用动态 SQL,所以我猜它可能很小。

【问题讨论】:

我将从错误消息指向的代码开始(您的问题中没有包含该代码) @MarkAdelsberger 我复制了整个错误报告。 是的,正如我所说,错误报告指向您未包含的代码。 请注意,通过以您拥有的方式使用动态 sql(不检查列/表名称是否符合标识符名称的规则(您可以通过 dbms_assert 执行)并且不使用绑定变量)让自己对SQL Injection敞开心扉。在这个时代,这真是太糟糕了...... 【参考方案1】:

错误意味着您的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)可能会导致混淆,即使语法完全有效。

【讨论】:

【参考方案2】:

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

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

如果你想使用using inv_num

【讨论】:

【参考方案3】:

我删了

using inv_num;

它开始起作用了。

【讨论】:

以上是关于动态 SQL 不存在绑定变量的主要内容,如果未能解决你的问题,请参考以下文章

动态SQL绑定变量静态SQL的性能对比

jdbc查询数据库报:java.sql.SQLException: ORA-01006: 绑定变量不存在

为啥我不能在动态 SQL 的 DDL/SCL 语句中使用绑定变量?

动态SQL(章节摘要)

动态sql与变量绑定

sql select语句作为动态plsql块的绑定变量