Невозможно повысить VALUE_ERROR, когда обязательные значения равны нулю - PullRequest
0 голосов
/ 30 марта 2019

employeeid, employeeename и jobid - это обязательные поля NOT NULL в моей таблице. Если какой-либо из них имеет значение null, я хочу вызвать исключение VALUE_ERROR, хотя я не получаю ожидаемых результатов.

CREATE OR REPLACE PROCEDURE insert_employee(
    p_employeeid IN employees.employeeid%TYPE,
    p_employeename IN employees.employeename%TYPE,
    p_phone IN employees.phone%TYPE,
    p_jobid IN employees.jobid%TYPE,
    p_salary IN employees.salary%TYPE,
    p_managerid IN employees.managerid%TYPE,
    p_departmentid IN employees.departmentid%TYPE

) 

IS

BEGIN
    IF p_employeeid = NULL THEN
        RAISE VALUE_ERROR;

    ELSE IF p_employeename = NULL THEN
        RAISE VALUE_ERROR;

    ELSE IF p_jobid = NULL THEN
        RAISE VALUE_ERROR;

    ELSE
    INSERT INTO employees (employeeid, employeename, phone, jobid, salary, managerid, departmentid)
    VALUES(p_employeeid, p_employeename, p_phone, p_jobid, p_salary, p_managerid, p_departmentid);

    END IF;

EXCEPTION
    WHEN VALUE_ERROR THEN
    RAISE_APPLICATION_ERROR (06502, 'VALUE_ERROR');

END;

Я получаю эту ошибку: Ошибки: ПРОЦЕДУРА INSERT_EMPLOYEE Строка / Кол: 30/1 PLS-00103: Обнаружен символ «ИСКЛЮЧЕНИЕ» при ожидании одного из следующих действий: (начинайте регистр, объявляйте завершение выхода для goto, если цикл mod null прагма поднять return select update, в то время как с << продолжить закрыть текущий удалить выборку заблокировать вставить открыть откат сохранение точка сохранения sql выполнить фиксацию для полной очистки канала слияния json_exist json_query json_object json_array Строка / столбец: 34/4 PLS-00103: обнаружен символ «конец файла» при ожидании одного из следующее: конец не прагма окончательный инстанцируемый персистентный порядок, переопределяющий статическую карту конструктора элемента </em>

1 Ответ

0 голосов
/ 30 марта 2019

Это неправильно, очевидно, по нескольким причинам.

  • сравнение значения со значением NULL должно быть с IS NULL или IS NOT NULL, а не с использованием знака равенства =
  • первый аргумент RAISE_APPLICATION_ERROR должен быть числом от -20001 до -20999 (хотя, как вы выразились, VALUE_ERROR является предопределенным исключением, вам не нужно повторно вызывать его)

Я сократил его (не хотелось напрасно набирать текст):

SQL> CREATE OR REPLACE PROCEDURE insert_employee(
  2    p_employeeid     IN               NUMBER,
  3    p_employeename   IN               NUMBER,
  4    p_jobid          IN               NUMBER
  5  )IS
  6  BEGIN
  7    IF p_employeeid IS NULL THEN
  8      RAISE value_error;
  9    ELSIF p_employeename IS NULL THEN
 10      RAISE value_error;
 11    ELSIF p_jobid IS NULL THEN
 12      RAISE value_error;
 13    ELSE
 14      NULL;
 15    END IF;
 16  EXCEPTION
 17    WHEN value_error THEN
 18      raise_application_error(-20001,'This is a VALUE_ERROR');
 19  END;
 20  /

Procedure created.

SQL>
SQL> EXEC insert_employee(1,2,NULL);
BEGIN insert_employee(1,2,NULL); END;

*
ERROR at line 1:
ORA-20001: This is a VALUE_ERROR
ORA-06512: at "SCOTT.INSERT_EMPLOYEE", line 18
ORA-06512: at line 1


SQL> EXEC insert_employee(1,2,3);

PL/SQL procedure successfully completed.

SQL>
...