2016-03-28 26 views
1

Bir pl/sql bloc içinde imleci kullanarak bir sorunum var. Ben Angajati(employees) denilen bir tablo var ve örneğin, her departament gelen tüm çalışanları göstermek gerekir: bunu yapmak çalışıyorum zamanPl/Sql imleç kullanarak, sorun yaşıyor

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

i ORA-06502: PL/SQL: numeric or value error: number precision too large gibi bir hata alınan veya benim komut şey gösterilmiyor. Bu benim kodudur:

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; 
/
+0

Tablo 'angajati (çalışanlar) için şemasını göster –

cevap

0

böyle bir sonuç elde etmek için, aşağıdaki kullanmak daha iyidir:

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

PL/SQL kodu: Yukarıda belirtildiği gibi

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

Stepan'ın cevabı bu daha basit bir şekilde yapılabilir, ancak eğer yaklaşımınız ile devam etmekte ısrar ederseniz. Bu yardımcı olabilir. Ama bu da SQL üzerinden yapılabilir. Mümkün olduğunda her zaman PLSQL üzerinden SQL'i tercih edin. Artık benimle çalışma alanım yok, lütfen herhangi bir sözdizimsel hataları affedin.

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; 
/
İlgili konular