需要知道我是否在PL / SQL中的存储过程中正确使用了IF语句

时间:2019-03-30 02:06:46

标签: oracle stored-procedures plsql

我对PL / SQL相当业余,而且我不知道我是否正确使用了IF语句。我正在使用Oracle Live SQL。这都是试图在名为“ employees”的表中插入新行。唯一的NOT NULL值是employeeid,employeename和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 个答案:

答案 0 :(得分:2)

我认为它甚至不会编译。此外,您不应该那样做(正如您已经被告知的那样)。如果可以的话,还有其他一些异议(关于原始问题:您是否正确使用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;

最后,您检查了最终条件并尝试提出一些建议

RAISE RAISE_APPLICATION_ERROR(-2000);

错误的原因有3个:

  • 您不RAISE RAISE_...
  • 用户定义的例外的范围是-20001-20999(五位数字,而不是4位数字)
  • RAISE_APPLICATION_ERROR还需要另一个参数

所以-正确-您会

raise_application_error(-20001, 'That does not exist');

答案 1 :(得分:1)

即使语法正确,我也认为您没有正确使用它们。

1)如果不允许将其设置为空,则在表上将其标记为NOT NULL

2)如果DepartmentID必须存在,则为外键约束。

3)如果employeeID存在,应该是唯一的约束(即使您的语法有效,也不能)

正确声明后,数据库引擎将为您确保所有这一切。