游标可以是显式的或隐式的,并且可以在FOR循环中使用这两种类型。您的问题确实有两个方面。
为什么在隐式游标FOR循环上使用显式游标FOR循环?
- 重用查询时,请使用显式游标FOR循环,否则首选隐式游标。
为什么要使用带有FETCH的循环而不是没有显式FETCH的FOR循环?
- 需要批量收集或需要动态SQL时,请在循环内使用FETCH。
这是文档中的一些有用信息。
隐式游标FOR LOOP的示例
BEGIN
FOR vItems IN (
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name
)
LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
显式游标FOR LOOP的示例
DECLARE
CURSOR c1 IS
SELECT last_name
FROM employees
WHERE manager_id > 120
ORDER BY last_name;
BEGIN
FOR vItems IN c1 LOOP
DBMS_OUTPUT.PUT_LINE ('Name = ' || vItems.last_name);
END LOOP;
END;
/
隐式游标
隐式游标是由PL / SQL构造和管理的会话游标。每当您运行SELECT或DML语句时,PL / SQL都会打开一个隐式游标。您无法控制隐式游标,但是可以从其属性获取信息。
隐式游标在其关联的语句运行后关闭;但是,其属性值将保持可用,直到另一个SELECT或DML语句运行。
隐式游标属性是:SQL%ISOPEN,SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT,SQL%BULK_ROWCOUNT,SQL%BULK_EXCEPTIONS
显式游标
显式游标是您构造和管理的会话游标。您必须声明并定义一个显式游标,为其指定一个名称并将其与查询关联(通常,该查询返回多行)。然后,您可以通过以下两种方式处理查询结果集:
打开显式游标(使用OPEN语句),从结果集中获取行(使用FETCH语句),然后关闭显式游标(使用CLOSE语句)。
在游标FOR LOOP语句中使用显式游标(请参阅“使用游标FOR LOOP语句进行查询结果集处理”)。
您不能将值分配给显式游标,不能在表达式中使用它或将其用作形式化的子程序参数或宿主变量。您可以使用游标变量执行这些操作(请参见“游标变量”)。
与隐式游标不同,您可以通过其名称引用显式游标或游标变量。因此,显式游标或游标变量称为命名游标。
游标FOR LOOP语句
游标FOR LOOP语句使您可以运行SELECT语句,然后立即循环遍历结果集的行。该语句可以使用隐式或显式游标。
FOR
只是使用游标的另一种方法。请参阅文档:docs.oracle.com/cd/E11882_01/appdev.112/e10472/… 无论如何,htp.prn()有什么作用?