2013-04-06 10 views
6

Istnieją 2 stoły EMPLOYEES i DEPARTMENTS z department_id jako klucz podstawowy dla DEPARTMENTS i klucza obcego na EMPLOYEES.PL/SQL dla pętli niejawna CURSOR

Chcę wydrukować wszystkie nazwiska pracowników, które należą do konkretnego działu. Wiem, że można to łatwo osiągnąć za pomocą kursorów JOINS lub EXPLICIT. Pomyślałem, dlaczego nie spróbować z pętli FOR i kursorami IMPLICIT.

Moje pytanie brzmi, czy jest poprawne pod względem składni tak, jak pisze INTO. Jeśli tak, dlaczego nie przypisujesz żadnych wartości?

DECLARE 
    emp_dept_id employees.department_id%TYPE; 
    emp_emp_id employees.employee_id%TYPE; 
    emp_last_name employees.last_name%TYPE; 
    dept_dept_id departments.department_id%TYPE; 
    dept_dept_name departments.department_name%TYPE; 
    v_count number DEFAULT 0; 
BEGIN 
    FOR i IN (SELECT DISTINCT department_id, department_name 
       INTO dept_dept_id, dept_dept_name 
     FROM departments) 
    LOOP 
     --v_COUNT := v_COUNT + 1; 
     DBMS_OUTPUT.PUT_LINE('HELLO'||dept_dept_id||' '||dept_dept_name); 
     FOR j IN (SELECT employee_id, last_name 
      INTO emp_emp_id, emp_last_name 
      FROM employees) 
      --WHERE department_id=dept_dept_id) 
     LOOP 
      DBMS_OUTPUT.PUT_LINE(emp_emp_id||' '||emp_last_name); 
      v_COUNT := v_COUNT + 1; 
     END LOOP; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE(v_COUNT); 
END; 
+0

Docs: https://docs.oracle.com/cloud/latest/db112/LNPLS/cursor_for_loop_statement.htm#LNPLS1155 – Vadzim

+0

Wydajność: https : //oracle-base.com/articles/misc/implicit-vs-explicit-cursors-in-oracle-plsql – Vadzim

Odpowiedz

15

Nie używać INTO z niejawnego kursora:

DECLARE 
     emp_dept_id employees.department_id%TYPE; 
     emp_emp_id employees.employee_id%TYPE; 
     emp_last_name employees.last_name%TYPE; 
     v_count number DEFAULT 0; 
    BEGIN 
     FOR i IN (SELECT DISTINCT department_id, department_name 
      FROM departments) 
     LOOP 
      --v_COUNT := v_COUNT + 1; 
      DBMS_OUTPUT.PUT_LINE('HELLO'||i.department_id||' '||i.department_name); 
      FOR j IN (SELECT employee_id, last_name 
       INTO emp_emp_id, emp_last_name 
       FROM employees) 
       --WHERE department_id=i.department_id) 
      LOOP 
       DBMS_OUTPUT.PUT_LINE(emp_emp_id||' '||emp_last_name); 
       v_COUNT := v_COUNT + 1; 
      END LOOP; 
     END LOOP; 
     DBMS_OUTPUT.PUT_LINE(v_COUNT); 
    END; 
    /
+0

Tak, to wygląda lepiej. I musi wykonać swoje 'INTO departamenty' przed uruchomieniem tego kodu, prawda? –

+2

Nie ma w ogóle INTO - odwołujesz się do wartości zwracanych przez kursor jako nazwa_trzyska.nazwa_kolumny –

+0

moje pytanie nadal pozostaje, jeśli nie jest właściwe używać INTO, dlaczego nie daje błędu ... i przykro mi, kursor jest jednoznaczny i mogę zapisać wartości używając zmiennej i FOR LOOP ..... –