2013-04-06 3 views
6

Ci sono 2 tavoli EMPLOYEES e DEPARTMENTS con department_id chiave come primaria per DEPARTMENTS e chiave esterna sul EMPLOYEES.PL/SQL PER LOOP cursore implicito

Desidero stampare tutti i nomi dei dipendenti che appartengono a un determinato reparto. So che può essere facilmente raggiunto tramite i cursori JOINS o EXPLICIT. Ho pensato perché non provare con il ciclo FOR e con i cursori IMPLICIT.

La mia domanda è se è sintatticamente corretto scrivere INTO in questo modo. In tal caso, perché non si assegna alcun valore?

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

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

+0

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

risposta

15

Non si utilizza INTO con un cursore implicito:

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

Sì, sembra migliore. E deve fare i suoi "reparti INTO" prima di eseguire questo codice, corretto? –

+2

No INTO - si fa riferimento ai valori restituiti dal cursore come nome_cursore.nome_colonna –

+0

la mia domanda rimane ancora se non è corretto utilizzare INTO, perché non sta dando alcun errore .... e mi dispiace il cursore è esplicito e posso memorizzare i valori usando la variabile i di FOR LOOP ..... –