Plsql 创建具有2个参数的过程并引发异常

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

我如何创建一个带有两个参数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%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:语句被忽略。我做错了什么

  • 似乎您需要逐行处理,但只提取一条记录。我想你会得到太多的行例外
  • Empid是顺序变量,但不是集合。您应该创建一个记录表并遍历它,以便脚本在empid.FIRST..empid.LAST循环中为i失败
  • 似乎您需要逐行处理,但只提取一条记录。我想你会得到太多的行例外
  • Empid是顺序变量,但不是集合。您应该创建一个记录表并遍历它,以便脚本在empid.FIRST..empid.LAST循环中为i失败
  • 嘿,我只是研究了一下这个问题,并在下面举例说明了一个片段 这肯定会奏效的。我没有工作空间,但是这个 应该有用。如果有任何问题,请告诉我

    创建或替换过程检查(
    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),这就是我尝试我们的原因