2

我在下面写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

4

2 回答 2

13

所有函数都必须执行 RETURN 语句。您的函数在其异常块中有 RETURN,因此该语句在正常情况下不会被执行。

通过带有自己的部分的附加块封闭select语句将解决您的问题。所以你的函数可能看起来像这样:begin endexception

create or replace function find_reference_no(
    p_ref_no IN VARCHAR2) return varchar2
AS
  v_ref_no varchar2(50);
begin
  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 := '#';
   end;
  return v_ref_no;    
end;
于 2013-03-11T09:06:57.343 回答
2

由于该函数只返回与表中存在的参数相同的值,因此您可以避免异常处理的尴尬使用并将其重写为:

  function find_reference_no(
      ref_no in varchar2)
  return varchar2
  as
    row_count integer
  begin
    select count(*)
    into   row_count
    from   cash
    where  cash.ref_no = find_reference_no.ref_no and
           rownum      = 1

    if row_count = 0
      return '#'
    else
      return ref_no
    end if;

  end find_reference_no;

我会返回一个 1 或 0(即 row_count 的值)来表示该记录存在或不存在。

  function find_reference_no(
      ref_no in varchar2)
  return varchar2
  as
    row_count integer
  begin
    select count(*)
    into   row_count
    from   cash
    where  cash.ref_no = find_reference_no.ref_no and
           rownum      = 1

    return row_count

  end find_reference_no;
于 2013-03-11T10:13:27.160 回答