sql >> データベース >  >> RDS >> Oracle

SELECTINTOで使用した場合にNO_DATA_FOUND例外がスローされない

    最小限の例は次のとおりです。

    CREATE FUNCTION raise_exception RETURN INT
    IS
    BEGIN
      RAISE NO_DATA_FOUND;
    END;
    /
    

    行う場合:

    SELECT raise_exception
    FROM   DUAL;
    

    NULLを含む単一の行を取得します 値-トムに質問 状態:

    その後、次のようにフォローアップしました:

    したがって、関数で例外が発生し、SQLクライアントはこれを認識して、NULLであるデータがないためこれを解釈します。 値を設定し、例外を「処理」します。

    だから

    DECLARE
      variable_name VARCHAR2(50);
    BEGIN
      SELECT raise_exception
      INTO   variable_name
      FROM   DUAL
    END;
    /
    

    DUALとして成功します テーブルには単一の行があり、関数からの例外は(サイレントに)処理され、変数にはNULLが含まれることになります。 値。

    ただし、

    BEGIN
      DBMS_OUTPUT.PUT_LINE( raise_exception );
    END;
    /
    

    例外は、今回は関数からPL / SQLスコープに渡されます-エラーを処理せず、例外ハンドラブロック(存在しない)に例外を渡すため、アプリケーションスコープに渡されて実行が終了しますプログラムの。

    そしてトムに尋ねる:

    ここで、関数を変更して別の例外を発生させた場合:

    CREATE OR REPLACE FUNCTION raise_exception RETURN INT
    IS
    BEGIN
      RAISE ZERO_DIVIDE;
    END;
    /
    

    次に両方:

    SELECT raise_exception
    FROM   DUAL;
    

    および:

    BEGIN
      DBMS_OUTPUT.PUT_LINE( raise_exception );
    END;
    /
    

    例外を処理してORA-01476 divisor is equal to zeroで終了する方法がわからない 。




    1. カンマ区切りの結果セット + SQL クエリ

    2. 合計が内部にあるMysqlgroup_concat

    3. MSSQL2019のUDF内での予期しない@@rowcountの動作

    4. PostgreSQLコマンドラインユーティリティを終了する方法:psql