如何在plsql中更新此功能?

时间:2013-05-23 00:07:11

标签: oracle function plsql

此功能检查所有员工的薪水是否在正确的最高工资和最低工资范围之间。我想更新它,以便它返回员工的工资超出范围? 我尝试并定义了一个集合,但它一直给我错误。任何想法??

create or replace function min_max return number as
cursor job_cur is
    select job_id, min_salary, max_salary from jobs;
cursor emp_cur(p_job_id jobs.job_id%type) is
    select employee_id, salary from employees where job_id = p_job_id;
Type id_table is table of number index by binary_integer;
return_id id_table;
i number := 1;
begin
for job_rec in job_cur loop
    for emp_rec in emp_cur(job_rec.job_id) loop
        if (emp_rec.salary > job_rec.max_salary)
            or (emp_rec.salary < job_rec.min_salary) then
            --return 0;
            return_id(i).emlpoyee_id := emp_rec.employee_id; // error here
            i := i+1;
        end if;
    end loop;
end loop;
--return 1;
return return_id;  // error here
end min_max;

这是更新的代码,但它不起作用。错误: 错误(15,17):PL / SQL:语句被忽略。 错误(15,30):PLS-00487:对变量“NUMBER”的引用无效。 错误(21,5):PL / SQL:语句被忽略。 错误(21,12):PLS-00382:表达式类型错误。

1 个答案:

答案 0 :(得分:0)

如果在函数外部定义类型,则该函数可以返回集合。另外,不要遍历两个游标。如果可以,始终将SQL操作作为一组进行操作。你可以通过这种方式获得更好的性能。

只要员工人数不是太大,这就有效:

CREATE TYPE id_table AS TABLE OF NUMBER;

CREATE OR REPLACE FUNCTION min_max RETURN id_table AS
  l_emp_list id_table;
BEGIN
  SELECT e.employee_id 
    BULK COLLECT INTO l_emp_list
    FROM employees e 
   INNER JOIN jobs j ON j.job_id = e.job_id
   WHERE e.salary NOT BETWEEN j.min_salary AND j.max_salary;

  RETURN l_emp_list;
END;

出于某种原因,SQLFiddle给我一个错误,但这在我的数据库中有用。