PL / SQL Exception не перехватывает исключение - PullRequest
0 голосов
/ 04 ноября 2018

Не могли бы вы, ребята, помочь мне понять, почему мой код не обрабатывает исключения и вместо этого выдает ошибку.

SQL> SET SERVEROUTPUT ON

DEFINE p_salary

DECLARE
v_fname employees.first_name%TYPE;
v_lname employees.last_name%TYPE;
v_salary employees.salary%TYPE := &p_salary;

BEGIN
SELECT first_name, last_name
INTO v_fname, v_lname
FROM employees
WHERE salary = v_salary;

INSERT INTO messages(results)
VALUES(v_fname || ' ' 
               || v_lname 
               || ' is the only employee with the salary of '
               || v_salary);

EXCEPTION
WHEN TOO_MANY_ROWS THEN
    INSERT INTO messages(results)
    VALUES('More than one employee with a salary of ' || v_salary);

WHEN NO_DATA_FOUND THEN
    INSERT INTO messages(results) 
    VALUES('No employee with the salary of ' || v_salary);

WHEN OTHERS THEN
    INSERT INTO messages(results)
    VALUES('Some other error occurred.');

END;
/SQL> SQL> SP2-0135: symbol p_salary is UNDEFINED
SQL> SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   
15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   
31   32  
Enter value for p_salary: 6000
old   4:     v_salary employees.salary%TYPE := &p_salary;
new   4:     v_salary employees.salary%TYPE := 6000;
DECLARE
*
ERROR at line 1:
ORA-01722: invalid number
ORA-06512: at line 20
ORA-01422: exact fetch returns more than requested number of rows

Ошибка - это то, что я положил в блок исключения, и все же оно не фиксируется.

1 Ответ

0 голосов
/ 04 ноября 2018

Кажется, вы пытаетесь вставить сообщения регистрации в столбец таблицы, которая принимает только цифры.

Исключение exact fetch returns more than requested number of rows перехватывается, но при обработке исходного исключения возникает еще одно исключение, поэтому кажется, что они оба вызываются вместе.

Вы не даете определение вашей messages таблицы, но я смог воспроизвести вашу ошибку, если создал ее с использованием create table messages (results number);.

Вам необходимо либо (a) изменить тип столбца results, скажем, VARCHAR2(4000), используя что-то вроде

alter table messages modify results varchar2(4000);

или (b) использовать другой столбец в этой таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...