web-dev-qa-db-ja.com

カーソルを使用するストアドプロシージャ

カーソルを使用して、部門ごとの全従業員の平均給与をリストするプロシージャを作成しようとしています。次のように定義された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;
/

カーソルを使用する必要があります。これは私の割り当ての一部です。

3
gigi

定義されていない_avg_sal.salary_を出力しようとしています。カーソル本体でエイリアスを使用します。

.... cursor c1 is select avg(e.salary) AS salary ...

サイドノート。渡されたパラメータ(_ddept_id_)は、印刷以外の手順内では使用されていないようです。また、JOIN構文が導入されてから長い年月が経過し、SQL89スタイル(およびOracleでも推奨)に比べてはるかに読みやすくなっています。最後に、この場合にカーソルを使用することは、私にはかなり疑わしいようです...

1
a1ex07

あなたはこれを間違った方法で行っていると思います。まず、問題を解決するための手順や関数は必要ないと思います。第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;
0
Chris