PL / SQL函数返回没有值

时间:2013-03-11 08:44:49

标签: oracle function plsql oracle11g

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

2 个答案:

答案 0 :(得分:9)

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

使用其select部分附加begin end块附加exception声明将解决您的问题。所以你的功能可能如下所示:

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;

答案 1 :(得分: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;