PL/SQL FOR LOOP IMPLICIT CURSOR
有 2 个表 EMPLOYEES 和 DEPARTMENTS,其中 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; |
- 文档:docs.oracle.com/cloud/latest/db112/LNPLS/…
- 性能:oracle-base.com/articles/misc/…
您不要将 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; / |
- 是的,这样看起来更好。而且他必须在运行此代码之前执行他的 INTO departments 操作,对吗?
- 根本没有 INTO – 您将游标返回的值引用为 cursor_name.column_name
- 如果使用 INTO 不正确,我的问题仍然存在,那么为什么它没有给出任何错误……我很抱歉光标是明确的,我可以使用 FOR LOOP 的变量 i 存储值……
- 我不知道为什么它没有引发错误。然而,在也可以使用隐式游标的情况下,通常不鼓励显式游标,因为它们需要更多代码,因此更容易出错且更难以支持,并且在许多情况下速度较慢。因此,只需使用正确的隐式游标语法,您的代码就可以工作。
查看此页面:http://www.techonthenet.com/oracle/loops/cursor_for.php。
我不认为你试图做的是有效的。将其分为两个步骤:FOR 循环和 INTO。您仍然可以在 FOR IN 中使用 SELECT,但它不能是 INTO。
来源:https://www.codenong.com/15854749/
