2016-05-11 28 views
0

2番目の行にこのPL/SQLを実行しているOracleエラーがあります。SELECT .... しかし、神様のために!/EXCEPTIONをBEGIN:いくつかのnull値ORA-01403:データが見つかりませんORACLE PL/SQL

IF zocRole IS NOT NULL and devices.unit_id IS NOT NULL THEN     
    SELECT unit_role_id INTO unitRoleId FROM T_UNIT_ROLE WHERE role_id = zocRole AND unit_id = devices.unit_id; 
END IF; 
+6

行うと仮定し

は、私は数年前、明示カーソル対暗黙的の相対速度に関するいくつかの議論があったことを覚えているが、私は誰もが長い間このことについて話を聞いていませんでしたnull値があるかどうかをチェックしますが、選択した行が条件に基づいて行を返すわけではありません。 – cableload

+2

予期せぬことが常に予想され、例外ハンドラを適切に処理して適切に処理します。 –

答えて

-2

ブロックを追加されているプロシージャ/ファンクションPLSQLでの実行を制御するための最良の方法があれば、私はすでに確認しました。

IF zocRole IS NOT NULL AND devices.unit_id IS NOT NULL 
THEN 
    BEGIN     
    SELECT unit_role_id 
    INTO unitRoleId 
    FROM T_UNIT_ROLE 
    WHERE role_id = zocRole 
    AND unit_id = devices.unit_id 
    ; 
    EXCEPTION 
    WHEN OTHERS 
    THEN dbms_output.put_line(SQLCODE||'-'||SUBSTR(SQLERRM, 1, 200)); 
    END 
    ; 
END IF 
; 
+0

悪い習慣 - 機能的には 'それ以外のときはNULL' - すべての例外が飲み込まれ成功として扱われます。 –

1

上記のように、暗黙カーソルは行を戻さないため、この例外がスローされます。複数の行が返された場合も例外が発生します。

明示カーソルを使用することができますOracle Documentsこれは本当に名前付きのSQL文です(必要に応じてパラメータを渡すことができます)。

次に、カーソルfetch(各フェッチは1行を取得しようとします)を開き、閉じます。フェッチでデータが返されたかどうかを確認できます。コード化には時間がかかりますが、よりきれいに見えます。私は、彼らははい、あなたが持っている同じ

関連する問題