【发布时间】:2013-02-26 09:02:23
【问题描述】:
我写在下面FUNCTION 以检查给定的reference number 是否存在。
FUNCTION find_reference_no(
p_ref_no IN VARCHAR2) RETURN VARCHAR2
AS
v_ref_no varchar2(50);
BEGIN
select REF_NO into v_ref_no from cash where REF_NO = p_ref_no;
EXCEPTION
WHEN no_data_found THEN
v_ref_no := '#';
RETURN v_ref_no;
END;
我在AFTER INSERT TRIGGER 中调用了这个函数。当我插入数据时,我收到错误
ORA-06503: PL/SQL: Function returned without value
我该如何解决这个问题?
PS:我没有将数据插入到cash 表中。我正在将数据插入另一个表(假设它是表 B)并在它的(表 B)AFTER INSERT TRIGGER 中调用此函数。
【问题讨论】:
-
这种在触发器中的查找正是我们应该避免在触发器中进行的那种。这是每次插入时的隐藏性能,并且会损害应用程序的可伸缩性。
-
不要在参数名称前加上 p_ 前缀,而是考虑在查询中的参数名称前加上函数名称——即。 “其中 cash.ref_no = find_reference_no.ref_no”。 v_ 作为变量的前缀也是多余的,它也应该是数据类型为 cash.ref_no%Type 而不是 varchar2(50)。
-
问题不明显的原因是您的代码格式具有误导性 - RETURN 语句 看起来 是函数正常处理的一部分,而实际上它在函数的异常块。 EXCEPTION 关键字实际上应该位于左边距,与 BEGIN 和 END 处于同一级别 - 为清楚起见。
标签: oracle function plsql oracle11g