动态SQL不存在绑定变量

时间:2017-08-22 12:27:36

标签: 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; 

我得到的错误是:

  

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

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

3 个答案:

答案 0 :(得分:4)

错误意味着您的background-image: url(/* URL */); background-position: 50%; background-size: auto 100%; background-repeat: repeat-x; 条款告诉它使用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;

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

请注意,动态SQL中begin execute immediate 'select * from dual where dummy = :b1' using 'X'; end; 之类的绑定只是位置占位符,并且名称与调用PL / SQL中的任何变量或参数无关,因此将它们命名为(例如:b1即使语法完全有效,也会引起混淆。

答案 1 :(得分:2)

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

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

如果您想使用using inv_num

答案 2 :(得分:0)

我删除了

using inv_num;

它开始起作用了。