2016-03-29 3 views
0

Я пытаюсь создать код, в котором я удаляю ученика из своей таблицы, указав его nr_matr, но если у меня нет этого nr_matr в моей таблице, тогда я хочу вычеркнуть исключение. это мой код:Ошибка создания пакета sql

CREATE OR REPLACE PACKAGE manager_faculty IS 
    PROCEDURE delete_stud (nr_matr student.nr_matricol%type); 
END manager_faculty; 
/

CREATE OR REPLACE PACKAGE BODY manager_faculty IS 

    PROCEDURE delete_stud (nr_matr student.nr_matricol%type) IS 
    BEGIN 
     DELETE from student 
     WHERE nr_matricol=nr_matr; 
    EXCEPTION 
     WHEN no_data_found THEN 
     SELECT COUNT(*) INTO counter FROM student WHERE nr_matricol=nr_matr; 
     IF counter = 0 THEN 
     raise_application_error (-20001, 'There is no student with the number' || nr_matr); 
     END IF; 
    END delete_stud; 

END manager_faculty; 
/

set serveroutput on; 
BEGIN 
manager_faculty.delete_stud(125); 
END; 
/

Когда я пытаюсь скомпилировать мой код он говорит, что тело пакета был создан ничуть ошибки компиляции. Что я делаю не так?

+1

Пожалуйста, запустите 'SHOW ERRORS'', пытаясь скомпилировать тело пакета и опубликовать сообщение об ошибке. – MT0

ответ

0

Ошибка PLS-00201: identifier 'COUNTER' must be declared, и вы можете найти это, запустив SHOW ERRORS;, пытаясь скомпилировать корпус вашего пакета.

Вы можете исправить это следующим образом:

CREATE OR REPLACE PACKAGE BODY manager_faculty IS 

    PROCEDURE delete_stud (nr_matr student.nr_matricol%type) 
    IS 
     counter INT; 
    BEGIN 
     DELETE FROM student 
     WHERE nr_matricol=nr_matr; 
    EXCEPTION 
     WHEN no_data_found THEN 
     SELECT COUNT(*) 
     INTO counter 
     FROM student 
     WHERE nr_matricol=nr_matr; 

     IF counter = 0 THEN 
      raise_application_error (
      -20001, 
      'There is no student with the number' || nr_matr 
     ); 
     END IF; 
    END delete_stud; 
END manager_faculty; 
/
SHOW ERRORS; 

Однако код не будет работать, как вы ожидаете, как DELETE FROM не будет бросать исключение, если он не удаляет строки. Вам нужно будет проверить SQL%ROWCOUNT:

CREATE OR REPLACE PACKAGE BODY manager_faculty IS 
    PROCEDURE delete_stud (nr_matr student.nr_matricol%type) 
    IS 
    BEGIN 
    DELETE from student 
    WHERE nr_matricol=nr_matr; 

    IF SQL%ROWCOUNT = 0 THEN 
     raise_application_error (
     -20001, 
     'There is no student with the number' || nr_matr 
    ); 
    END IF; 
    END delete_stud; 
END manager_faculty; 
/
0

Помимо использования SQL% ROWCOUNT, как ответил МТО, вы также можете использовать SQL% NOTFOUND.

% NOTFOUND дает TRUE, если INSERT, UPDATE или DELETE оператор не влияют ни одной строки, или заявление SELECT INTO не дал строки. В противном случае он дает FALSE.

CREATE OR REPLACE PACKAGE BODY manager_faculty IS 
    PROCEDURE delete_stud (nr_matr student.nr_matricol%type) 
    IS 
    BEGIN 
     DELETE from student 
     WHERE nr_matricol=nr_matr; 

     IF SQL%NOTFOUND THEN 
     raise_application_error (
      -20001, 
      'There is no student with the number' || nr_matr 
     ); 
     END IF; 
    END delete_stud; 
END manager_faculty; 

Вы можете прочитать here, если вы хотите знать другие атрибуты SQL Cursor.

Смежные вопросы