动态 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 不存在绑定变量的主要内容,如果未能解决你的问题,请参考以下文章
jdbc查询数据库报:java.sql.SQLException: ORA-01006: 绑定变量不存在