PL / SQL POUR BOUCLE CURSEUR IMPLICITE

il y a 2 tables EMPLOYEES et DEPARTMENTS avec department_id comme clé primaire pour DEPARTMENTS et clé étrangère sur EMPLOYEES .

je veux imprimer tous les noms d'employés qui appartiennent à un ministère particulier. Je sais qu'il peut être facilement atteint par jointures ou EXPLICIT curseurs. J'ai pensé pourquoi ne pas essayer avec pour boucle et un IMPLICIT curseurs.

ma question Est si c'est syntaxiquement correct d'écrire INTO comme ce. Dans l'affirmative, pourquoi n'attribue-t-on aucune valeur?

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;
6
demandé sur Mark 2013-04-06 22:51:03

2 réponses

que vous n'utilisez pas avec un curseur implicite:

    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;
    /
18
répondu David Aldridge 2013-04-06 18:55:52

vérifier cette page: http://www.techonthenet.com/oracle/loops/cursor_for.php .

Je ne pense pas que ce que vous essayez de faire soit valable. Séparez ceci en deux étapes: la boucle FOR et la boucle INTO. Vous pouvez toujours avoir un SELECT dans le FOR IN, ça ne peut pas être un INTO.

0
répondu Robert Harvey 2013-04-06 18:55:40