2016-03-02 2 views
1

Я новичок в plsql. Нижеприведенный код работает без какой-либо ошибки компиляции, но исключение notFoundException не вызвано. Любая помощь будет назначена.Исключение не вызвано в plsql

declare 
    abc exception; 
    notFoundException exception; 
    cursor c1(dd number) is select first_name from employees where salary = dd; 

begin 
    for i in c1(&t) 
    loop 
     if(c1%rowcount!=1) then 
      raise abc; 
     elsif(c1%notfound) then 
      raise notFoundException; 
     else 
      dbms_output.put_line(i.first_name); 
     end if; 
end loop; 
Exception 
     when abc then 
      dbms_output.put_line('abc'); 
      insert into messages values('too many rows exception');   
     when notFoundException then 
      dbms_output.put_line('notFoundException'); 
      insert into messages values('Nobody with this salary : '); 
end; 
/
+2

Есть много проблем с этим кодом. Если запрос не возвращает строк, вы никогда не войдете в свой цикл. 'c1% rowcount' - это количество строк, которые были выбраны до сих пор, не сколько строк будет извлечено. 'c1% notfound' никогда не будет« истинным »в этом случае. Я предполагаю, что это домашнее задание, и я не уверен, что это такое, чего вы на самом деле пытаетесь достичь. Возможно, вы хотите выполнить 'select into', а затем обработать дескрипторы' no_data_found' и 'too_many_rows'. –

ответ

0

Предлагаю вам ознакомиться с курсорами в PL/SQL. Курсор для цикла будет проходить через каждую запись, которая извлекается в курсоре. Если данные не найдены, выполнение никогда не будет выполняться внутри цикла, поэтому исключение данных не будет вызвано внутри цикла. Ваш код должен выглядеть так:

declare 
    abc exception; 
    notFoundException exception; 
    lv_first_name varchar2(240); 
    cursor c1(dd number) is select first_name from employees where salary = dd; 

begin 

    open c1; 
    fetch c1 into lv_first_name; 
    if(c1%rowcount > 1) then 
     raise abc; 
    elsif(c1%notfound) then 
     raise notFoundException; 
    else 
     dbms_output.put_line(lv_first_name); 
    end if; 
    close c1; 

Exception 
     when abc then 
      dbms_output.put_line('abc'); 
      insert into messages values('too many rows exception');   
     when notFoundException then 
      dbms_output.put_line('notFoundException'); 
      insert into messages values('Nobody with this salary : '); 
end; 
+0

Не забудьте закрыть курсор. –

+0

были незначительные ошибки при открытии c1 (& t) и около курсора закрытия. я удалил цикл for и попытался, но все еще не работал. Я новичок, поэтому, возможно, мне нужно много читать и практиковать. Спасибо за ответ. @Dinesh – Dudupoo

+0

Да PLSQL не сложно изучить. Практика может сделать вас лучше. Всего наилучшего. Пожалуйста, поделитесь кодом, который все еще не работает для вас –

0

При использовании FOR LOOP вам не нужно использовать атрибуты курсора. Вы можете просто запросить записи и принять решение после этого. Вот пример работы (у меня не было таблицы сотрудников, поэтому было создано заглушка). Удобная вещь о FOR LOOP заключается в том, что вам не нужно беспокоиться о закрытии курсора.

DECLARE 
    abc    EXCEPTION; 
    notfoundexception EXCEPTION; 
    CURSOR c1(dd NUMBER) IS 
    SELECT * 
     FROM (SELECT MOD(rownum, 3) salary 
        ,rownum first_name 
       FROM dual 
      CONNECT BY LEVEL < 10) 
    WHERE salary = dd; 

    v_count NUMBER := 0; 
BEGIN 
    FOR i IN c1(2) LOOP 
    v_count := v_count + 1; 

    IF (v_count > 1) THEN 
     RAISE abc; 
    END IF; 

    dbms_output.put_line(i.first_name); 
    END LOOP; 

    IF (v_count = 0) THEN 
    RAISE notfoundexception; 
    END IF; 

EXCEPTION 
    WHEN abc THEN 
    dbms_output.put_line('abc'); 
    --insert into messages values('too many rows exception');   
    WHEN notfoundexception THEN 
    dbms_output.put_line('notFoundException'); 
    --insert into messages values('Nobody with this salary : '); 
END; 
/
2

Вы можете использовать ниже анонимный блок и попробуйте

`SET SERVEROUTPUT ON; 

DECLARE 

first_name_in employees.first_name%ROWTYPE; 
Salary_in  employees.salary%ROWTYPE; 

BEGIN 

Salary_in:=&Salary; 

SELECT first_name 
INTO first_name_in 
FROM employees 
WHERE salary = Salary_in; 

EXCEPTION 
WHEN NO_DATA_FOUND THEN 
DBMS_OUTPUT.PUT_LINE('Nobody with this salary :'||Salary_in); 
INSERT 
INTO messages 
VALUES ('NO_DATA_FOUND exception'); 

WHEN TOO_MANY_ROWS THEN 
DBMS_OUTPUT.PUT_LINE('Too many with this salary :'||Salary_in); 
INSERT 
INTO messages 
VALUES ('TOO_MANY_ROWS exception'); 

WHEN OTHERS THEN 
DBMS_OUTPUT.PUT_LINE('select failed with error'||SUBSTR(SQLERRM,1,100)) 
INSERT 
INTO messages 
VALUES (SUBSTR(SQLERRM,1,100)); 

COMMIT; 
END; 
/` 
Смежные вопросы