SELECT INTOステートメントが少なくとも1つの行を返さない場合、ORA-01403がスローされます。
他のすべてのDBMSについては、これはSELECTでは正常であることを私は知っています。OracleだけがSELECTINTOをこのように扱います。
CREATE OR REPLACE PROCEDURE no_data_proc IS
dummy dual.dummy%TYPE;
BEGIN
BEGIN
SELECT dummy
INTO dummy
FROM dual
WHERE dummy = 'Y';
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('Why is this needed?');
END;
END no_data_proc;
なんで?
私の意見では、この例外は実際には必要ありません。オーバーヘッドが多すぎます。便利な場合もありますが、BEGIN、EXCEPTION、WHEN、ENDブロック全体を記述する必要があります。
見えない本質的な理由はありますか?