Pet*_*vić -3 sql plsql 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;
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
从第 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,所以我想它可能很小。
该错误意味着您的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
Run Code Online (Sandbox Code Playgroud)
您将使用using带有绑定变量的子句,如下所示:
declare
some_var varchar2(1) := 'X';
begin
execute immediate 'select * from dual where dummy = :b1' using some_var;
end;
Run Code Online (Sandbox Code Playgroud)
或者你可以传递一个文字值:
begin
execute immediate 'select * from dual where dummy = :b1' using 'X';
end;
Run Code Online (Sandbox Code Playgroud)
(这个演示实际上没有做任何事情,因为它不处理动态查询的输出 - 只是为了演示语法。)
请注意,:b1动态 SQL 中的绑定只是位置占位符,并且名称与调用 PL/SQL 中的任何变量或参数无关,因此将它们命名为(例如:p_id)会导致混淆,即使语法完全有效.