web-dev-qa-db-fra.com

PL / SQL POUR LE CURSEUR IMPLICITE DE BOUCLE

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

Je souhaite imprimer tous les noms des employés appartenant à un service particulier. Je sais que cela peut être facilement réalisé par des curseurs JOINS ou EXPLICIT. J'ai pensé pourquoi ne pas essayer avec la boucle FOR et les curseurs IMPLICIT.

Ma question est de savoir s'il est syntaxiquement correct d'écrire INTO comme ceci. Si oui, pourquoi n'attribue-t-il 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
qasim.hasnain

Vous n'utilisez pas INTO 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
David Aldridge

Consultez cette page: http://www.techonthenet.com/Oracle/loops/cursor_for.php .

Je ne pense pas que ce que vous essayez de faire soit valide. Décomposez cela en deux étapes: la boucle FOR et l'INTO. Vous pouvez toujours avoir un SELECT dans le FOR IN, il ne peut tout simplement pas être un INTO.

0
Robert Harvey