カーソルを使用して、部門ごとの全従業員の平均給与をリストするプロシージャを作成しようとしています。次のように定義された3つのテーブルを使用しています
emp
(eid、ename、年齢、給与)works
(eid、did、pct_time)dept
(did、dname、budget、managerid)手順はエラーでコンパイルされます。何が悪いのですか?以下の手順の定義を参照してください。
create or replace procedure get_avgSalary(ddept_id in dept.did%type)
is
cursor c1 is
select avg(e.salary)
from emp e, works w, dept d
where e.eid=w.eid and d.did = w.did
group by w.did;
avg_sal c1%rowtype;
begin
for avg_sal in c1 loop
dbms_output.put_line('Average salary of the employees in department ' || ddept_id ||' is '|| avg_sal.salary);
end loop;
end;
/
カーソルを使用する必要があります。これは私の割り当ての一部です。
定義されていない_avg_sal.salary
_を出力しようとしています。カーソル本体でエイリアスを使用します。
.... cursor c1 is select avg(e.salary) AS salary ...
サイドノート。渡されたパラメータ(_ddept_id
_)は、印刷以外の手順内では使用されていないようです。また、JOIN
構文が導入されてから長い年月が経過し、SQL89スタイル(およびOracleでも推奨)に比べてはるかに読みやすくなっています。最後に、この場合にカーソルを使用することは、私にはかなり疑わしいようです...
あなたはこれを間違った方法で行っていると思います。まず、問題を解決するための手順や関数は必要ないと思います。第2に、カーソルがどのように挿入されるかは、はっきりとはわかりません。
OVER()句を使用して次のウィンドウクエリを試してください。
SELECT avg(e.salary) OVER(PARTITION BY d.dname) FROM emp e, works w, dept d
WHERE e.eid=w.eid and d.did = w.did;