Необходимо знать, правильно ли я использую операторы IF в хранимых процедурах в PL / SQL - PullRequest
1 голос
/ 30 марта 2019

Я довольно любитель PL / SQL, и я не знаю, правильно ли я использую операторы IF. Я использую Oracle Live SQL. Все это пытается вставить новую строку в таблицу под названием «сотрудники». И единственными значениями NOT NULL являются employeeid, employeeename и jobid

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

AS
BEGIN
    IF p_employeeid IS NULL THEN /* If one of the mandatory values are null */
        RAISE VALUE_ERROR;
    END IF;

    IF p_employeename IS NULL THEN 
        RAISE VALUE_ERROR;
    END IF;

    IF p_jobid IS NULL THEN
        RAISE VALUE_ERROR;
    END IF;

    IF p_jobid != employees.jobid THEN /* if jobid entered is not in the table */
        RAISE VALUE_ERROR;
    END IF;

    IF p_salary < 0 THEN /* if the entered salary is negative */
        RAISE VALUE_ERROR;
    END IF;

    IF p_departmentid != employees.departmentid THEN /* if the departmentid entered is not in the table */
        RAISE VALUE_ERROR;
    END IF;

    IF p.employeeid = employees.employeeid THEN /* if the employeeid already exists */
        RAISE RAISE_APPLICATION_ERROR(-2000);
    END IF;

    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;

Ответы [ 2 ]

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

Не думаю, что это даже скомпилируется. Кроме того, вы не должны делать это таким образом (как вам уже сказали). Еще несколько возражений, если можно (в связи с первоначальным вопросом: правильно ли вы используете IF).

Связка первых IF с может быть сокращена на OR:

IF p_employeeid   IS NULL OR
   p_employeename IS NULL OR
   p_jobid        IS NULL OR
   p_salary < 0 
THEN
    RAISE VALUE_ERROR;
END IF;

Вы не можете ссылаться на табличные значения таким образом, например

IF p_jobid != employees.jobid THEN /* if jobid entered is not in the table */
    RAISE VALUE_ERROR;
END IF;

Там нет employees.jobid - вы должны сначала выбрать его. Например:

declare
  l_cnt;
begin
  select count(*)
    into l_cnt
    from employees e
    where e.jobid = p_jobid;

  if l_cnt = 0 then     -- there's no such job in the table
     raise value_error;
  end if;
end;

Наконец, условие final , которое вы проверили и попытались поднять что-то

RAISE RAISE_APPLICATION_ERROR(-2000);

неверно по 3 причинам:

  • Вы не RAISE RAISE_...
  • Пользовательский диапазон исключений составляет от -20001 до -20999 (пять цифр, а не 4)
  • RAISE_APPLICATION_ERROR требует еще один аргумент

так - правильно - вы бы

raise_application_error(-20001, 'That does not exist');
1 голос
/ 30 марта 2019

Даже если синтаксис правильный, я не думаю, что вы используете их правильно.

1) Если нельзя допустить, чтобы вещи были пустыми, отметьте их как NOT NULL в таблицах.

2) Если идентификатор отдела должен существовать, то это ограничение внешнего ключа.

3) Если employeeID существует, это должно быть уникальным ограничением (даже если ваш синтаксис работает, а он нет)

Правильно заявленный, двигатель БД обеспечит все это для вас.

...