【问题标题】:PL/SQL FOR LOOP IMPLICIT CURSORPL/SQL FOR 循环隐式光标
【发布时间】:2013-03-29 02:20:28
【问题描述】:

有两个表EMPLOYEESDEPARTMENTSdepartment_id 作为DEPARTMENTS 的主键和EMPLOYEES 的外键。

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

我的问题是这样写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;

【问题讨论】:

标签: oracle for-loop plsql database-cursor


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您不要将 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;
        /
    

    【讨论】:

    • 是的,看起来更好。而且他必须在运行此代码之前执行他的INTO departments,对吗?
    • 根本没有 INTO -- 您将游标返回的值引用为 cursor_name.column_name
    • 如果使用 INTO 不正确,我的问题仍然存在,那么为什么它没有给出任何错误......我很抱歉光标是明确的,我可以使用变量 i 存储值FOR循环.....
    • 我不知道为什么它没有引发错误。然而,在也可以使用隐式游标的情况下,通常不鼓励显式游标,因为它们需要更多代码,因此更容易出错且更难以支持,并且在许多情况下速度较慢。所以,只要使用正确的隐式游标语法,你的代码就可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2012-03-27
    • 2012-04-28
    相关资源
    最近更新 更多