Oracle

使用游標的儲存過程

  • July 5, 2015

我正在嘗試使用游標創建一個程序,以列出每個部門所有員工的平均工資。我正在使用三個表,定義為

  • emp(開齋節、姓名、年齡、薪水)
  • works(開齋節,做,pct_time)
  • dept(did、dname、預算、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 也推薦)。最後,在這種情況下使用游標對我來說似乎很可疑……

我認為你的做法是錯誤的。首先,我認為您不需要程序/功能來解決您的問題。其次,我絕對看不到游標應該如何進入它。

**使用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;

引用自:https://dba.stackexchange.com/questions/105281