У меня проблема с синтаксическим кодом исключения внутри цикла for в Oracle SQL Server - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу добавить исключение, когда счет моего менеджера равен 0. Но в моем коде есть синтаксическая ошибка, и я не знаю, что делать.

ошибка:

PLS-00103: Обнаружен символ «ИСКЛЮЧЕНИЕ» при ожидании одного из следующих действий:

(начинайте регистр, объявляйте конец выхода для goto, если цикл mod null pragma поднимает return select update, в то время как << продолжить закрыть текущее удалениеизвлекать блокировку вставить открытый откат сохранить точку сохранения установить sql выполнить зафиксировать полное объединение очистить канал json_exists json_value json_query json_object json_array 06550. 00000 - "строка% s, столбец% s: \ n% s" * Причина: обычно ошибка компиляции PL / SQL. * Действие: </p>

FOR l in c LOOP
select count(*) into variable
    from table where job = 'Manager'
    and condition;


    if SQL%NOTFOUND
EXCEPTION
    then 
        RAISE e_my_exception;
    end if;
    //the code to check salary of employee greater than president or lower than 100 is here //

    WHEN e_my_exception THEN
    DBMS_OUTPUT.PUT_LINE('ERROR!!! One department has no manager ');  
END LOOP;

Я ожидал напечатать «ОШИБКА !!! В одном отделе нет менеджера», но вместо этого есть ошибка:

Ответы [ 3 ]

0 голосов
/ 01 ноября 2019

Нет такой вещи, как "oracle sql server" (как подсказывает ваш заголовок). Это либо «Oracle», либо «(Microsoft) SQL Server». Код, который вы разместили, - Oracle, поэтому я бы посоветовал вам исправить заголовок.


Теперь ваш вопрос: как count (*) не будет работать, «данные не найдены», ни «sql% notfound»«когда там ничего нет (но 0 в результате) - посмотрите демонстрацию:

SQL> select count(*) from dual where 1 = 2;

  COUNT(*)
----------
         0

SQL>

тогда вы можете сделать что-то вроде этого:

FOR l in c LOOP
  begin
    select count(*) into variable
      from table where job = 'Manager'
      and condition;

    if variable = 0 then
       RAISE e_my_exception;
    end if;
    --the code to check salary of employee greater than president or lower than 100 is here //

  exception
    WHEN e_my_exception THEN
      DBMS_OUTPUT.PUT_LINE('ERROR!!! One department has no manager ');  
END LOOP;  

Такой код будет отображать сообщение(если ваш инструмент его поддерживает), но цикл продолжится зацикливание , т. е. ваш код не остановится.


Хотя, на самом деле, вы не повышаете что-нибудь, более простой вариант будет

FOR l in c LOOP
    select count(*) into variable
      from table where job = 'Manager'
      and condition;

    if variable = 0 then
       DBMS_OUTPUT.PUT_LINE('ERROR!!! One department has no manager ');  
    end if;
    --the code to check salary of employee greater than president or lower than 100 is here //
END LOOP;  
0 голосов
/ 01 ноября 2019

Вы реализуете его в неправильном формате, это выглядит следующим образом ...

DECLARE 
   <declarations section> 
BEGIN 
   <executable command(s)> //your logic
EXCEPTION 
   <exception handling> 
END;

и цикл реализован таким образом ... просто например

DECLARE 
   i number(1); 
   j number(1); 
BEGIN 
   FOR i IN 1..3 LOOP 
         dbms_output.put_line('i is: '|| i ); 
   END loop; 
END; 

и для обработки исключений см. это ...

    DECLARE 
   c_id customers.id%type := 8; 
   c_name customerS.Name%type; 
   c_addr customers.address%type; 
BEGIN 
   SELECT  name, address INTO  c_name, c_addr 
   FROM customers 
   WHERE id = c_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  c_name); 
   DBMS_OUTPUT.PUT_LINE ('Address: ' || c_addr); 

EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such customer!'); 
   WHEN others THEN 
      dbms_output.put_line('Error!'); 
END; 
0 голосов
/ 01 ноября 2019

Вы неправильно обрабатываете исключения. Я предлагаю следующее:

FOR l in c LOOP
  BEGIN
    select count(*)
      into variable
      from table where job = 'Manager'
      and condition;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      DBMS_OUTPUT.PUT_LINE('ERROR!!! One department has no manager');  
  END;
END LOOP;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...