Plsql 创建具有2个参数的过程并引发异常
我如何创建一个带有两个参数func和sal的过程来验证员工的工资是否在最低工资和最高工资之间(来自JOBS表的2列),如果他们不在其中,它需要抛出一个异常? 我还使用了employees表中的行(薪水、员工id、工作id),到目前为止,我得到了以下结果:Plsql 创建具有2个参数的过程并引发异常,plsql,Plsql,我如何创建一个带有两个参数func和sal的过程来验证员工的工资是否在最低工资和最高工资之间(来自JOBS表的2列),如果他们不在其中,它需要抛出一个异常? 我还使用了employees表中的行(薪水、员工id、工作id),到目前为止,我得到了以下结果: CREATE OR REPLACE PROCEDURE check_sal(func employees.job_id%type,sal employees.salary%type) IS max_sal jobs.max_salary%typ
CREATE OR REPLACE PROCEDURE check_sal(func employees.job_id%type,sal employees.salary%type)
IS
max_sal jobs.max_salary%type;
min_sal jobs.min_salary%type;
empid employees.employee_id%type;
BEGIN
SELECT e.employee_id,e.salary,e.job_id,j.max_salary,j.min_salary INTO empid,sal,func,max_sal,min_sal
FROM employees e JOIN jobs j ON e.job_id = j.job_id
ORDER by e.employee_id;
FOR i IN empid.FIRST..empid.LAST LOOP
IF(sal < min_sal) OR (sal > max_sal) THEN RAISE_APPLICATION_ERROR(-20000,'OUT OF BOUND');
ELSE DMBS_OUTPUT.PUT_LINE('OK');
END IF;
END LOOP;
END;
创建或替换过程检查(func employees.job\u id%type,sal employees.salary%type)
是
最大工作。最大工资百分比类型;
最低工资工作。最低工资百分比类型;
empid employees.employeen\u id%类型;
开始
选择e.employee\u id、e.salary、e.job\u id、j.max\u salary、j.min\u salary进入empid、sal、func、max\u sal、min\u sal
从员工e加入e.job_id=j.job_id上的jobs j
按e.employee_id订购;
对于empid.FIRST..empid.LAST循环中的i
如果(salmax_-sal),则引发应用程序错误(-20000,“超出范围”);
ELSE DMBS_输出。PUT_行('OK');
如果结束;
端环;
结束;
我在第10行得到错误:PL/SQL:语句被忽略。我做错了什么
创建或替换过程检查(
func employees.job_id%类型,
sal员工。工资百分比(类型)
是
键入“最大值”选项卡
是
职位表。最高工资百分比类型;
最大容量最大容量标签;
键入empid\u选项卡
是
员工表。员工id%类型;
empid empid_选项卡;
键入sal_选项卡
是
员工表。工资百分比类型;
sal_标签;
输入jobid\u选项卡
是
员工表。职务id%类型;
func jobid_选项卡;
键入min_sal_选项卡
是
员工表。最低工资百分比类型;
min_sal min_sal_选项卡;
开始
选择e.employee\u id,
e、 薪水,
e、 工作证,
j、 最高工资,
j、 最低工资批量收取
进入empid,
萨尔,
func,
马克斯·索尔,
米努萨尔
来自雇员
加入jobs j
在e.job\u id=j.job\u id上
按e.employee_id订购;
因为我在empid.第一..empid.最后
环
如果(salmax_sal(i)),则
引发应用程序错误(-20000,'OUT BOUND',TRUE);
其他的
DMBS_输出。输入_行('OK');
--不要在任何产品环境中使用dbms输出
如果结束;
端环;
结束;
嘿,我只是研究了一下这个问题,并在下面举例说明了一个片段
这肯定会奏效的。我没有工作空间,但是这个
应该有用。如果有任何问题,请告诉我
创建或替换过程检查(
func employees.job_id%类型,
sal员工。工资百分比(类型)
是
键入“最大值”选项卡
是
职位表。最高工资百分比类型;
最大容量最大容量标签;
键入empid\u选项卡
是
员工表。员工id%类型;
empid empid_选项卡;
键入sal_选项卡
是
员工表。工资百分比类型;
sal_标签;
输入jobid\u选项卡
是
员工表。职务id%类型;
func jobid_选项卡;
键入min_sal_选项卡
是
员工表。最低工资百分比类型;
min_sal min_sal_选项卡;
开始
选择e.employee\u id,
e、 薪水,
e、 工作证,
j、 最高工资,
j、 最低工资批量收取
进入empid,
萨尔,
func,
马克斯·索尔,
米努萨尔
来自雇员
加入jobs j
在e.job\u id=j.job\u id上
按e.employee_id订购;
因为我在empid.第一..empid.最后
环
如果(salmax_sal(i)),则
引发应用程序错误(-20000,'OUT BOUND',TRUE);
其他的
DMBS_输出。输入_行('OK');
--不要在任何产品环境中使用dbms输出
如果结束;
端环;
结束;
刚刚发现没有必要使用FOR和empid变量,因此答案要简单得多:
CREATE OR REPLACE PROCEDURE check_sal(func employees.job_id%TYPE,sal employees.salary%TYPE)
AS
max_sal jobs.max_salary%TYPE;
min_sal jobs.min_salary%TYPE;
BEGIN
SELECT max_salary,min_salary into max_sal,min_sal
FROM JOBS
WHERE job_id=func;
DBMS_OUTPUT.PUT_LINE(max_sal||' and '||min_sal);
IF sal < min_sal OR sal > max_sal THEN RAISE_APPLICATION_ERROR(-20205,'Out of Bounds');
END IF;
END;
创建或替换过程检查(func employees.job\u id%TYPE,sal employees.salary%TYPE)
作为
最大工作。最大工资百分比类型;
最低工资工作。最低工资百分比类型;
开始
选择“最高薪资”、“最低薪资”进入“最高薪资”、“最低薪资”
来自乔布斯
其中job_id=func;
DBMS|u OUTPUT.PUT|u行(max|sal |和'| min|sal);
如果salmax_sal,则引发应用程序错误(-20205,“越界”);
如果结束;
结束;
刚刚发现没有必要使用FOR和empid变量,因此答案要简单得多:
CREATE OR REPLACE PROCEDURE check_sal(func employees.job_id%TYPE,sal employees.salary%TYPE)
AS
max_sal jobs.max_salary%TYPE;
min_sal jobs.min_salary%TYPE;
BEGIN
SELECT max_salary,min_salary into max_sal,min_sal
FROM JOBS
WHERE job_id=func;
DBMS_OUTPUT.PUT_LINE(max_sal||' and '||min_sal);
IF sal < min_sal OR sal > max_sal THEN RAISE_APPLICATION_ERROR(-20205,'Out of Bounds');
END IF;
END;
创建或替换过程检查(func employees.job\u id%TYPE,sal employees.salary%TYPE)
作为
最大工作。最大工资百分比类型;
最低工资工作。最低工资百分比类型;
开始
选择“最高薪资”、“最低薪资”进入“最高薪资”、“最低薪资”
来自乔布斯
其中job_id=func;
DBMS|u OUTPUT.PUT|u行(max|sal |和'| min|sal);
如果salmax_sal,则引发应用程序错误(-20205,“越界”);
如果结束;
结束;
为什么需要使用employees表中的行?除非我误解了,否则您真正需要做的就是查询jobs表。因为您需要将salary表中的行与Employees表中的行进行比较,我们需要将每个Employees的行与jobs表中的min_salary和max_salary进行比较。为什么您需要使用Employees表中的行?除非我误解了,否则您真正需要做的就是查询jobs表。因为您需要的是来自salary who的行,而salary who是Employees表的行,我们需要将每个员工的工资与最低工资和最高工资进行比较,这是工作表中的行。我需要将每个员工的工资与最低工资和最高工资进行比较,并通过工作id进行连接(员工有外键工作id,工作有主键工作id),这就是我尝试我们的原因