将表名作为参数传递时 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 中:如何将表名作为存储过程和/或函数参数传递?