PL / SQL FOR LOOP IMPLICIT CURSOR

时间:2013-04-06 18:51:03

标签: oracle for-loop plsql cursor

EMPLOYEES有两个表格DEPARTMENTSdepartment_id DEPARTMENTS作为EMPLOYEES的主键和EXPLICIT上的外键。

我想打印属于特定部门的所有员工姓名。我知道可以通过JOINS或IMPLICIT游标轻松实现。 我想为什么不尝试使用FOR循环和INTO游标。

我的问题是,如果在这个语法上写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; 是正确的。如果是这样,为什么不分配任何值?

{{1}}

2 个答案:

答案 0 :(得分:18)

您不要将INTO与隐式游标一起使用:

    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;
    /

答案 1 :(得分:0)

查看此页面:http://www.techonthenet.com/oracle/loops/cursor_for.php

我不认为你要做的事情是有效的。将其分为两个步骤:FOR循环和INTO。你仍然可以在FOR IN中使用SELECT,它不能是INTO。