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 に答える