2016-03-28 11 views
1

pl/sqlブロックでカーソルを使用する際に問題があります。私はAngajati(employees)と呼ばれるテーブルを持っていると私は、たとえば、すべてのdepartamentから全従業員を表示する必要があります:私はこれを行うにしようとしていますときカーソルを使用しているPl/Sqlに問題があります

Dep 10: 
     John Smith 
     King Steven 
Dep 20: 
     Henry King 
     William 
... 

が、私はORA-06502: PL/SQL: numeric or value error: number precision too largeのようなエラーを受け取ったか、私のスクリプトは何も表示されていません。これは私のコードです:上記で述べたように

BEGIN 
FOR dep IN (SELECT id_departament, 
             COUNT(*) cnt 
          FROM angajati 
          GROUP BY id_departament 
          ORDER BY id_departament) LOOP 
     dbms_output.put_line('Dep ' || dep.id_departament || '. Count employee ' || dep.cnt); 
     FOR empl IN (SELECT * FROM angajati WHERE id_departament = dep.id_departament) LOOP 
      dbms_output.put_line(empl.nume || ' ' || empl.prenume); 
     END LOOP; 
END LOOP; 
END; 
+0

テーブル 'angajati(employees)'のスキーマを表示する –

答えて

0

このような結果を得るためには、以下を使用することをお勧めしStepanの答えは、この簡単な方法でも行えますが、あなたのアプローチを踏まなければならない場合は、これが役立つかもしれません。しかし、これもSQLを介して行うことができます。可能な限りPLSQLより常にSQLを優先します。私は今、私と一緒に作業スペースを持っていないので、構文上の誤りを許してください。

DECLARE 
    dep_min angajati.id_departament%type; 
    dep_max angajati.id_departament%type; 
    id_min angajati.id_angajat%type; 
    id_max angajati.id_angajat%type; 
    i angajati.id_angajat%type; 
BEGIN 
    SELECT MIN(id_departament), 
    MAX(id_departament) 
    INTO dep_min, 
    dep_max 
    FROM angajati; 

    SELECT MIN(id_angajat), 
    MAX(id_angajat) 
    INTO id_min, 
    id_max 
    FROM angajati; 

    dbms_output.put_line('...'); 
    dbms_output.put_line('Departamentul ' || dep_min); 
    FOR k IN id_min..id_max 
    LOOP 
    FOR J IN 
    (SELECT nume, 
     prenume, 
     id_departament, 
     id_angajat 
    FROM angajati 
    WHERE id_angajat=i 
    ) 
    LOOP 
     IF(j.id_departament=dep_min) THEN 
     dbms_output.put_line(j.nume || ' ' || j.prenume); 
     ELSE 
     NULL; 
     END IF; 
    END LOOP; 
    dep_min:=dep_min+10; 
    END LOOP; 
END; 
/
0

Dep 10: 
     John Smith 
     King Steven 
Dep 20: 
     Henry King 
     William 

PL/SQLコード:

declare 

dep_min angajati.id_departament %type; 

dep_max angajati.id_departament %type; 

id_min angajati.id_angajat %type; 


id_max angajati.id_angajat %type; 

i angajati.id_angajat %type; 

cursor c is select nume, prenume, id_departament, id_angajat from angajati where id_angajat=i; 

    r c%rowtype; 



begin 
    select min(id_departament), max(id_departament) into dep_min, dep_max from angajati; 
    select min(id_angajat), max(id_angajat) into id_min, id_max from angajati; 

    open c; 

    loop 
    dbms_output.put_line('...'); 
    dbms_output.put_line('Departamentul ' || dep_min); 

    for i in id_min..id_max 
    loop 

     fetch c into r; 

    if(r.id_departament=dep_min) then 
     dbms_output.put_line(r.nume || ' ' || r.prenume); 
    else null; 
    end if; 

    exit when id_min>id_max; 
    end loop; 

    dep_min:=dep_min+10; 
    end loop; 
    close c; 
end; 
/
関連する問題