0

私は次のようなテーブルを持っています:

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ですpolices who have same boss。ここでの結果は次のようになります。 30000(salary of C)+45000(salary of D) どちらもボス E の下にあるためです。どうすればよいですか? ORACLE pl/sql または匿名ブロックの E の下にある C と D を見つけるにはどうすればよいですか?

4

2 に答える 2

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

上司のカーソルを反復する必要がある場合は、上記のクエリを使用してカーソルを定義できます。ただし、合計を計算するためにカーソルを使用しないでください。SQL に任せましょう。

于 2012-10-07T15:21:03.647 に答える
-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;

ここでは、カーソルとループに関する詳細情報を見つけることができます。

于 2012-10-07T13:11:13.967 に答える