Я пытался получить исключение, просто чтобы посмотреть, как это работает. Я объявляю курсор, который не извлекает данные из таблицы, потому что согласно моему предложению where зарплата не превышает 60000. Курсор должен быть пустым? Я попробовал два способа получить сообщение об ошибке, но получил сообщение типа «анонимный блок завершен».
set serverout ON
declare
c_empid kt_test.empid%type;
cursor c_kt is select empid into c_empid from kt_test where salary > 60000;
BEGIN
open c_kt;
fetch c_kt into c_empid;
exception
WHEN NO_DATA_FOUND THEN
raise_application_error(-20001,'Data not found for employee');
close c_kt;
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR(-20002,'Other error-'||SQLCODE||'-'||SQLERRM);
end;
А также
set serverout ON
declare
c_empid kt_test.empid%type;
cursor c_kt is select empid into c_empid from kt_test where salary > 60000;
BEGIN
open c_kt;
fetch c_kt into c_empid;
IF c_kt%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('Explicit Cursor: No data found');
END IF;
END;
line 1: SQLPLUS Command Skipped: set serverout ON
anonymous block completed
Чего здесь не хватает, чтобы я получил сообщение об ошибке?
@Aleksej Я поправил. Но первый код все еще не работает. Просто завершается с сообщением «анонимный блок завершен».
Что вы ожидали вместо этого? Если в таблице есть хотя бы одна строка, соответствующая вашему фильтру, это ничего не напечатает.
В таблице kt_test нет записи с зарплатой более 60000. Я просто хочу использовать исключение no_data_found с курсором. Является ли это возможным?
С курсором - нет.
Спасибо, я не знал об этом.





Вы можете попробовать этот вариант (немного измененный):
set serveroutput ON
declare
c_empid kt_test.empid%type;
cursor c_kt is
select empid
from kt_test
where salary > 60000;
BEGIN
open c_kt;
fetch c_kt into c_empid;
close c_kt;
IF c_empid is null THEN
DBMS_OUTPUT.PUT_LINE('Explicit Cursor: No data found');
END IF;
END;
При запуске в анонимном блоке в разработчике pl / sql вывод: «Явный курсор: данные не найдены»
Если вы хотите, чтобы этот первый сегмент кода работал, вам нужно переписать его следующим образом:
declare
c_empid number;
BEGIN
select empid
into c_empid
from kt_test
where salary > 60000;
exception
when no_data_found then
DBMS_OUTPUT.PUT_LINE('Insert into: No data found');
END;
Простой рабочий пример:
SQL> set serveroutput on
SQL> declare
2 cursor c is select 1 from dual where 1 = 0;
3 vN number;
4 begin
5 open c;
6 fetch c into vN;
7
8 if c%NOTFOUND then
9 dbms_output.put_line('No data');
10 end if;
11 end;
12 /
No data
PL/SQL procedure successfully completed.
SQL>
Или используйте ваше собственное определенное сообщение об ошибке.
SET serveroutput ON
DECLARE
custom_err EXCEPTION;
PRAGMA EXCEPTION_INIT( custom_err, -20001 );
CURSOR c
IS
SELECT 1 FROM dual WHERE 1 = 0;
vN NUMBER;
BEGIN
OPEN c;
FETCH c INTO vN;
IF c%NOTFOUND THEN
raise_application_error( -20001, 'This is a custom error' );
END IF;
EXCEPTION
WHEN custom_err THEN
dbms_output.put_line( sqlerrm );
END;
Я получил вывод: анонимный блок завершен. ORA-20001: это настраиваемая ошибка, так что в чем польза PRAGMA EXCEPTION_INIT (custom_err, -20001). Не могли бы вы объяснить вкратце.
Вам нужен
set serveroutPUT ON