0

この関数は、すべての従業員の給与が最高給与と最低給与の正しい範囲内にあるかどうかをチェックします。給与が範囲外の従業員のIDを返すように更新したい?? コレクションを定義しようとしましたが、エラーが発生し続けます。何か案は ??

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: 式のタイプが間違っています。

4

1 に答える 1

0

関数の外部で型を定義すると、関数はコレクションを返すことができます。また、2 つのカーソルをループしないでください。可能であれば、常に 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 でエラーが発生していますが、これは私のデータベースでは機能します。

于 2013-05-23T00:31:47.273 に答える