create table police(
ssn
name
boss_name
salary
);
Insert into police values(1,’A’,’C’,10000);
Insert into police values(2,’B’,’D’,20000);
Insert into police values(3,’C’,’E’,30000);
Insert into police values(4,’D’,’E’,45000);
Insert into police values(5,’E’,NULL,55000);
我希望cursor
返回total salary
的{{1}}。结果将是:
polices who have same boss
因为他们都在老板E下。我怎么做?我如何在ORACLE pl / sql或匿名块中找到E和C下的C和D?
答案 0 :(得分:2)
Gaurav Soni和APC在评论中给出了很好的建议。
一般经验法则 - 不要将游标用于可以使用直接SQL轻松解决的问题。直接SQL通常要快得多。
以下SQL将列出每个老板,直接下属的总薪水以及直接下属的数量。
select boss_name,
sum(salary) total_salary,
count(*) employee_count
from police
where boss_name is not null
group by boss_name
如果你需要迭代boss,你当然可以使用上面的查询来定义你的游标。但是你不应该使用游标来计算总数。让SQL完成工作。
答案 1 :(得分:-1)
试试这段代码:
set serveroutput on;
declare
cboss_name varchar2(30) ;
csalary number ;
CURSOR cur
is
select boss_name,sum(salary) as salary
from police
where boss_name is not null
group by boss_name;
begin
open cur;
fetch cur into cboss_name,csalary;
dbms_output.put_line('boss_name'||' '||'csalary');
LOOP
FETCH cur INTO cboss_name,csalary;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line(cboss_name||' '||csalary);
END LOOP;
close cur;
end;
Here您可以找到有关游标和循环的更多信息。