Zadanie z pętlą Loop i Cursorem Oracle PL/SQL

0

Cześć wszystkim,
Potrzebuje pomocy przy jednym zadaniu:

Napisz blok PL/SQL, w którym do tabeli Emps_in_Depts (Deptno NUMBER(2), Pracownicy VARCHAR2(4000)) są wprowadzone wiersze postaci (deptno,ename1$ename2$....enamek$), gdzie ename1,ename2,...,enamek są wszystkimi pracownikami zatrudnionymi w dziale o numerze deptno np. (10,CLARK$KING$MILLER$).

Stworzyłem takie zapytanie:

  DECLARE
  CURSOR kursor_dept IS
  SELECT DISTINCT e.deptno FROM Emp e;  
  rek_dept kursor_dept%ROWTYPE;  
  CURSOR kursor_osoba IS
  SELECT  e.ename, e.deptno  FROM Emp e;  
  rek_osoby kursor_osoba%ROWTYPE;
  nazwa varchar2(200):=''; 
BEGIN
  OPEN kursor_dept;
  OPEN kursor_osoba;
  LOOP
    FETCH kursor_dept INTO rek_dept;
    EXIT WHEN kursor_dept%NOTFOUND;
  
        LOOP
            FETCH kursor_osoba INTO rek_osoby;
            EXIT WHEN kursor_osoba%NOTFOUND;   
                IF rek_dept.deptno = rek_osoby.deptno THEN
                nazwa:= nazwa||'$'||rek_osoby.ename ;
                END IF;
        END LOOP;
        INSERT INTO Emps_in_Depts  values (rek_dept.deptno,nazwa);
        nazwa:='';    
  END LOOP;
  CLOSE kursor_osoba;
  CLOSE kursor_dept;
  COMMIT;   
END;
/

screenshot-20210112231655.png

Niestety zamiast dla każdego działu, wypisuje tylko dla pierwszego, czyli deptno = 30 i nie jestem wstanie zrozumieć o co chodzi. Tak jakby warunek IF nie był spełnony mimo, że potem przy kolejnym obrocie jest deptno 20 i 10.
Wiem, że to pewnie coś banalnego ale nie ogarniam czemu to nie łapie.
Z góry dzięki za wszelką pomoc.

1

@Victor Włodarski: Problemem jest umiejscowienie inserta. Dodajesz rekord zawsze po przekręceniu całej pętli z kursor_osoba. W momencie wykonywania Inserta wartość w rek_dept.deptno zawsze ma wartość największą(ostatnią wartość z pętli).
p.s. Wydaje się, że wszystkie osoby lecą do 30 więc zobacz ale pewnie część z nich powinna być w 20 i 10.

0

Hej,
dzięki wielkie za odpowiedź.
Nie wiem czy dobrze rozumiem. "Insert powininen być zawsze po przekręceniu całej pętli z kursor_osoba" Teraz chyba jest Insert jest wstawiony po END LOOP kursor_osoba? czyli wstawia
"wartość największą(ostatnią wartość z pętli", a po drugim obrocie pętli kursor_dept ostatnia wartość to 20. I nie powinien taką podstawić do IFa, a potem do Insert?

Tabela ogólnie wygląda tak:

screenshot-20210113001025.png

Więc dla każdego z deptno powinno znaleźć kilku pracowników.

Dzięki wielkie za zainteresowanie i sorki, że nie załapałem co robie źle :)

0

Nie potrzeba do tego pętli, użyj LISTAGG

0

@Victor Włodarski: Czy udało Ci się uzyskąć prawidłowy wynik ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1