2016-03-28 2 views
1

У меня проблема с использованием курсора в блоке pl/sql. У меня есть таблица под названием Angajati(employees) и мне нужно, чтобы отобразить список всех сотрудников из каждого Отделения, например: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 или мой сценарий не показывает ничего. Это мой код:

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

Показать вашу схему для таблицы 'angajati (сотрудники)' –

ответ

0

Чтобы получить такой результат, то лучше использовать следующее:

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

PL код/​​SQL:

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

Как упоминалось выше, ответ Степана, это может быть сделано с помощью этого более простого способа, но если вы настаиваете на том, чтобы идти через ваш подход. Может быть, это помогает. Но это можно сделать и с помощью SQL. Всегда предпочитайте SQL по PLSQL, когда это возможно. У меня сейчас нет рабочего пространства, поэтому прошу прощения за любые синтаксические ошибки.

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; 
/
Смежные вопросы