创建一个包含2个参数的过程并抛出异常

时间:2015-12-13 18:16:02

标签: plsql

如何创建一个带有2个参数func和sal的过程来验证员工的工资是在min_salary和max_salary之间(来自JOBS表的2个列),如果它们不在其中,它需要抛出异常吗? 另外我正在使用employees表中的行(salary,employee_id,job_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;

我在第10行得到错误错误:PL / SQL:语句被忽略。我做错了什么?

3 个答案:

答案 0 :(得分:0)

  1. 似乎你想要逐行处理但只提取1条记录。我认为你会得到太多行异常。
  2. Empid是序数变量但不是集合。您应该创建一个记录表并迭代它,以便您的脚本在FOR i IN empid.FIRST..empid.LAST LOOP上失败。

答案 1 :(得分:0)

  

嘿,我只是查看了问题并说明了下面的片段   这肯定会奏效。我没有工作区,但这个   应该管用。如有任何问题,请告诉我。

$qb
        ->select('d')
        ->leftJoin('d.user', 'u')
        ->where($qb->expr()->isNotNull('d.deletedAt'))
        ->andWhere('u.id = :user_id')
        ->setParameter('user_id', $user->getId())
        ->orderBy('d.dtrDate', 'DESC');

答案 2 :(得分:0)

刚刚发现使用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;