1

当我为execute immediate.

在下面的示例中,我可以将绑定变量用于a,bret,但是当我尝试绑定 for 时,f我得到一个ORA-06502: PL/SQL: numeric or value error: character to number conversion error. 为什么以及如何我也可以绑定f

我正在使用 11.2.0.1.0。

create or replace function so4fun (
  a in number, 
  b in number,
  f in varchar2
) return number as
  decl constant varchar2(32767) := 
    'declare a constant number := :a; b constant number := :b;';
  stmt varchar2(32676);
  ret number;
begin
  /* This one works: */
  stmt := decl || ' begin :result := ' || f || '; end;';
  execute immediate stmt using in a, in b, out ret;

  /* But why this one doesn't ?

  stmt := decl || ' begin :result := :f; end;';
  execute immediate stmt using in a, in b, out ret, in f;

  This doesn't work either:

  stmt := decl || ' tmp number; begin tmp := :f; :result := tmp; end;';
  execute immediate stmt using in a, in b, in f, out ret;

  Both are giving me ORA-06502: PL/SQL: numeric or value error: character to
  number conversion error */

  return ret;
end;
/
show errors

/* expected result when a = 1, b = 2 is 1.5 */
select so4fun(1, 2, '(a + b) / b') from dual;

drop function so4fun;
4

2 回答 2

2

绑定变量用于绑定变量,而不是用于绑定代码片段。这个想法是,Oracle 可以编译和缓存一个查询或代码块,并使用不同的参数多次执行它。

但是,您尝试使用参数绑定来替换计算公式。它会阻止编译和缓存代码块,因此不受支持。

此外,它不能用当前的语法来表达。如果 Oracle 看到tmp := :f它认为您只是想将参数分配给f变量tmp。它不需要评估函数。

只需使用有效的解决方案即可。毕竟它有效。

于 2011-08-02T05:54:52.020 回答
1

发生错误是因为您声明f为 avarchar2但您已在注释掉的部分中写入以下内容:

tmp number; begin tmp := :f ...

您尝试将“字符”值分配给需要数字的变量。您还尝试分配f给再次需要数字的函数结果。

事情很好,||因为那是字符串连接。

您需要以某种方式将 varchar2 转换为TO_NUMBER(f)数字f

于 2011-08-02T05:35:13.453 回答