Oracle 返回的PL/SQL函数没有值

Oracle 返回的PL/SQL函数没有值,oracle,function,plsql,oracle11g,Oracle,Function,Plsql,Oracle11g,我在下面写了函数,检查给定的参考号是否存在 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 :

我在下面写了
函数
,检查给定的
参考号是否存在

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;
我在插入触发器后的
中调用了此函数。当我插入数据时,我得到的错误如下

ORA-06503:PL/SQL:Function返回时没有值

我怎样才能解决这个问题


PS:我没有在
cash
表中插入数据。我正在将数据插入另一个表(假设它是表B),并在插入触发器后在其(表B)
中调用此函数

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

通过附加的
begin-end
块将
select
语句包含在自己的
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;

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

  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;

触发器中的这种查找正是我们应该避免在触发器中进行的那种查找。这是一个隐藏的性能在每个插入,并将损害你的应用程序的可扩展性,而不是预先用Py的参数名称,考虑预先在参数中的名称名称的查询功能,即“。v_作为变量的前缀也是多余的,变量的数据类型也应该是cash.ref_no%Type,而不是varchar2(50)。问题不明显的原因是您有误导性的代码格式-返回语句看起来像是函数正常处理的一部分,而实际上它在函数的异常块中。EXCEPTION关键字实际上应该位于左侧空白处,与BEGIN和END处于同一级别-为了清晰起见。