Пустой курсор и исключение

Я пытался получить исключение, просто чтобы посмотреть, как это работает. Я объявляю курсор, который не извлекает данные из таблицы, потому что согласно моему предложению 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

Чего здесь не хватает, чтобы я получил сообщение об ошибке?

Вам нужен set serveroutPUT ON

Aleksej 12.07.2018 14:19

@Aleksej Я поправил. Но первый код все еще не работает. Просто завершается с сообщением «анонимный блок завершен».

Kaushal Talniya 12.07.2018 14:25

Что вы ожидали вместо этого? Если в таблице есть хотя бы одна строка, соответствующая вашему фильтру, это ничего не напечатает.

Aleksej 12.07.2018 14:31

В таблице kt_test нет записи с зарплатой более 60000. Я просто хочу использовать исключение no_data_found с курсором. Является ли это возможным?

Kaushal Talniya 12.07.2018 14:34

С курсором - нет.

Ychdziu 12.07.2018 14:36

Спасибо, я не знал об этом.

Kaushal Talniya 12.07.2018 14:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
6 035
3

Ответы 3

Вы можете попробовать этот вариант (немного измененный):

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). Не могли бы вы объяснить вкратце.

Kaushal Talniya 13.07.2018 13:53

Другие вопросы по теме