可以的,“游标(Cursor)能嵌套”这个结论在绝大多数支持游标的数据库/编程语言里都是成立的,但具体能不能、怎么写,取决于你用的是哪种环境。
下面分常见情况说明:
可以在一个游标循环里,再打开并使用另一个游标。
DECLARE
CURSOR c_dept IS SELECT deptno FROM dept;
CURSOR c_emp(p_deptno NUMBER) IS
SELECT ename FROM emp WHERE deptno = p_deptno;
BEGIN
FOR d IN c_dept LOOP
FOR e IN c_emp(d.deptno) LOOP
DBMS_OUTPUT.PUT_LINE(e.ename);
END LOOP;
END LOOP;
END;
✅ 外层游标遍历部门
✅ 内层游标依赖外层参数
DECLARE cur_dept CURSOR FOR SELECT dept_id FROM dept;
OPEN cur_dept;
FETCH NEXT FROM cur_dept INTO @dept_id;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE cur_emp CURSOR FOR
SELECT name FROM emp WHERE dept_id = @dept_id;
OPEN cur_emp;
FETCH NEXT FROM cur_emp INTO @name;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @name;
FETCH NEXT FROM cur_emp INTO @name;
END
CLOSE cur_emp;
DEALLOCATE cur_emp;
FETCH NEXT FROM cur_dept INTO @dept_id;
END
CLOSE cur_dept;
DEALLOCATE cur_dept;
⚠️ 注意:
cur1 = conn.cursor()
cur2 = conn.cursor()
cur1.execute("SELECT id FROM dept")
for (dept_id,) in cur1:
cur2.execute("SELECT name FROM emp WHERE dept_id=%s", (dept_id,))
for row in cur2:
print(row)
⚠️ 注意:
❌ 性能差(逐行处理)
❌ 代码复杂、难维护
❌ 容易被锁表
✅ 更推荐:
JOIN游标可以嵌套,但能不用就不用,能集合就别游标。
如果你能告诉我:
我可以给你最合适的写法和优化建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。