我对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;
答案 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存在,应该是唯一的约束(即使您的语法有效,也不能)
正确声明后,数据库引擎将为您确保所有这一切。