8

カーソルを開く前に3つのIf/Thenステートメントを持つ関数があります。If / Thenステートメントは、カーソルを開く前に有効性をチェックします。

If / Thenの妥当性チェックをもう1つ追加したいのですが、他のチェックよりも少し複雑です。以下はサンプルであり、私が追加したいものをブロックコメントしました:

begin
    if not procedure.validation_function (<variable>, <condition>=TRUE) then
        return variable2;
    end if;

   /* if not exists
    (
       SELECT 'x' FROM table1
       WHERE table1_id = variable1_id
       AND trunc(sysdate) < trunc(table1_date + 60)
    ) then
        return variable2;
    end if; */

    open cursor(<argument>);
    fetch cursor into <variable>;
    close cursor;
    return <variable>;


end;

私の問題は、私がT-SQLの世界から来ており、PL/SQLで存在しない場合のコマンドが機能しないことを発見していることです。関数内から、SELECTを利用するIf NO_DATA_FOUNDステートメントを作成する方法はありますか?

その中に別の関数をネストする方法はありますか?

begin
     SELECT ....
     FROM ....
     WHERE ....
        if NO_DATA_FOUND then
           return variable2;
        end if;
end;
4

1 に答える 1

9

Exists条件はSQL文でのみ使用でき、PL/SQLで直接使用することはできません。いくつかのオプションがあります:

  • ステートメント内で条件付きのcase 式を使用する:existsselect

    SQL> declare
      2    l_exists number(1);
      3  begin
      4    select case
      5             when exists(select 1
      6                           from employees
      7                          where department_id = 1)
      8             then 1
      9             else 0
     10           end into l_exists
     11      from dual;
     12  
     13     if (l_exists = 1)
     14     then
     15       dbms_output.put_line('exists');
     16     else
     17       dbms_output.put_line(q'[doesn't exist]');
     18     end if;
     19  end;
     20  /
    
     doesn't exist
    
     PL/SQL procedure successfully completed
    
  • または (rownum複数のレコードが一致条件を満たす場合に 1 つのレコードのみが返されることを保証するために必要です):

    SQL> declare
      2    l_exists number;
      3  begin
      4  
      5    select 1
      6      into l_exists
      7      from employees
      8     where department_id = 100
      9       and rownum = 1;
     10  
     11     dbms_output.put_line('exists');
     12  
     13  exception
     14    when no_data_found
     15    then dbms_output.put_line(q'[doesn't exist]');
     16  end;
     17  /
    
     exists
    
     PL/SQL procedure successfully completed
    
于 2012-11-22T04:25:05.957 に答える