如何使用游标在sql中的其他数据下查找数据

时间:2012-10-07 11:50:11

标签: sql oracle plsql aggregation

我有一张像这样的表:

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?

2 个答案:

答案 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您可以找到有关游标和循环的更多信息。