Как избавиться от ошибки компиляции в процедуре PL / SQL? - PullRequest
0 голосов
/ 06 ноября 2019

Будучи новичком в PL / SQL, я не могу понять, как управлять пользовательскими исключениями в процедурах. Мой код выдает предупреждение «Процедура завершена с ошибками компиляции».

CREATE OR REPLACE PROCEDURE raise_salary
(eid IN employees.e_id%TYPE:=&emp_id,
raise IN employees.salary:=&salary_raise)
IS
cnt INTEGER;
salary employees.salary%TYPE;
BEGIN
    SELECT count(*) INTO cnt FROM employees WHERE e_id=eid;
    IF cnt=0 THEN
        RAISE INVALID_ID;
    ELSE
        SELECT salary INTO sal FROM employees WHERE e_id=eid;
        IF sal IS NULL THEN
            RAISE NULL_VALUE;
        ELSE
            UPDATE employees SET salary=salary+raise WHERE e_id=eid;
            dbms_output.put_line('Salary raised!');
        END IF;
    END IF;
EXCEPTION
    WHEN INVALID_ID THEN
        dbms_output.put_line('User ID does not exist!');
    WHEN NULL_VALUE THEN
        dbms_output.put_line('Salary is null in table!');
    WHEN others THEN
        dbms_output.put_line('Error!');
END;
/

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Пример:

SQL> CREATE OR REPLACE PROCEDURE testException
  2  IS
  3  BEGIN
  4      raise INVALID_ID;
  5  EXCEPTION
  6      WHEN INVALID_ID THEN
  7          dbms_output.put_line('Invalid ID');
  8  END;
  9  /

Warning: Procedure created with compilation errors.

Способ узнать об ошибках:

SQL> sho err
Errors for PROCEDURE TESTEXCEPTION:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PL/SQL: Compilation unit analysis terminated
4/5      PL/SQL: Statement ignored
4/11     PLS-00201: identifier 'INVALID_ID' must be declared
6/10     PLS-00201: identifier 'INVALID_ID' must be declared

Вам необходимо объявить используемые исключения:

SQL> CREATE OR REPLACE PROCEDURE testException
  2  IS
  3      INVALID_ID exception;
  4  BEGIN
  5      raise INVALID_ID;
  6  EXCEPTION
  7      WHEN INVALID_ID THEN
  8          dbms_output.put_line('Invalid ID');
  9  END;
 10  /

Procedure created.
0 голосов
/ 06 ноября 2019

В этом DEMO вы увидите все 3 ситуации, которые должна обрабатывать эта ПРОЦЕДУРА:

Вот правильная процедура:

CREATE OR REPLACE PROCEDURE raise_salary
(eid IN employees.e_id%TYPE,
raise IN employees.salary%type)
IS

cnt INTEGER;
sal employees.salary%TYPE;
INVALID_ID exception;
NULL_VALUE exception;

BEGIN

 SELECT count(*) 
 INTO cnt 
 FROM employees 
 WHERE e_id=eid;

 IF cnt=0 THEN
     RAISE INVALID_ID;
 ELSE    
     SELECT salary 
     INTO sal 
     FROM employees 
     WHERE e_id=eid;

     IF sal IS NULL THEN
            RAISE NULL_VALUE;
        ELSE
            UPDATE employees 
            SET salary = (SAL + raise)
            WHERE e_id = eid;

            dbms_output.put_line('Salary raised!');
     END IF;    
 END IF;

exception
 WHEN INVALID_ID THEN
     dbms_output.put_line('User ID does not exist!');
 WHEN NULL_VALUE THEN
     dbms_output.put_line('Salary is null in table!');
 WHEN others THEN
     dbms_output.put_line('Error!');
END;
/

У вас было более одногоошибки, и один из них был приятно объяснен @Aleksej в своем ответе VOTE UP. У вас также есть строка:

SELECT salary INTO sal FROM employees WHERE e_id=eid;

Но вы не объявили sal. Надеюсь, это поможет ...

...