关于oracle:PL/SQL FOR LOOP IMPLICIT CURSOR

PL/SQL FOR LOOP IMPLICIT CURSOR

有 2 个表 EMPLOYEESDEPARTMENTS,其中 department_id 作为 DEPARTMENTS 的主键和 EMPLOYEES 的外键。

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

我的问题是这样写 INTO 在语法上是否正确。如果是这样,为什么不分配任何值?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    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;
    /


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

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