将表名作为参数传递时 PL/SQL 函数不起作用

Posted

技术标签:

【中文标题】将表名作为参数传递时 PL/SQL 函数不起作用【英文标题】:PL/SQL function not working while passing table name as parameter 【发布时间】:2014-06-10 08:54:38 【问题描述】:

以下是我的功能,

create or replace 
FUNCTION checkXML
 (idx in number , tblname in varchar2) 
 return xmltype 
is 
required_xml XMLTYPE;
saved_hash_value raw(50);
current_hash_value raw(50);
xml_not_equal EXCEPTION;

begin
execute immediate 'select checkfield , my_hash(extract(xmlcol,'/')) , xmlcol into saved_hash_value , 
                   current_hash_value , required_xml  from ' || tblname || '  where indexid =' || idx ;


if saved_hash_value = current_hash_value then
  return required_xml;
else
  RAISE xml_not_equal;  
end if;

end;

我想知道哪里出错了。

收到的错误信息是,

ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SYSTEM.CHECKXML", line 11
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    
*Action:

【问题讨论】:

【参考方案1】:

您的 SQL 语句中有未转义的单引号,因此斜线 / 被解释为除法符号,而不是字符串的一部分。您需要添加转义:

my_hash(extract(xmlcol, ''/''))

您还应该为idx 真正使用绑定变量,而您的into 用于动态SQL 的位置错误:

execute immediate 'select checkfield , my_hash(extract(xmlcol, ''/'')) ,
  xmlcol from ' || tblname || ' where indexed = :idx'
into saved_hash_value , current_hash_value , required_xml
using idx;

也不确定您要实现的例外情况。您已在本地声明它,然后尝试引发它,但我认为这只会产生未处理的用户定义异常错误。您可能只想raise an application error,提供您自己的错误编号和消息,例如:

  ...
  if saved_hash_value != current_hash_value then
    raise_application_error(-20001, 'XML hash is not correct');  
  end if;
  return required_xml;
end;

【讨论】:

以上是关于将表名作为参数传递时 PL/SQL 函数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中:如何将表名作为存储过程和/或函数参数传递?

将表名作为输入参数动态传递并使用它[重复]

存储过程,将表名作为参数传递

Oracle函数:如何将表名作为参数传递,并使用游标结果作为表名?

如何将表名作为参数传递给存储过程?

C语言中,数组名作为函数参数,属于啥传递,为啥?