绑定变量不存在动态 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
)可能会引起混淆,即使语法完全有效。
我正在玩动态 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
)可能会引起混淆,即使语法完全有效。