PQSQL里游标的使用

游标(cursor )是一个指向上下文区的句柄或指针
可以用来控制上下文区和处理语句时上下文区会发生的事情。

在这里插入图片描述

隐式游标

在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标

在PL/SQL中使用DML语句时自动创建隐式游标
隐式游标自动声明、打开和关闭,其名为 SQL
通过检查隐式游标的属性可以获得最近执行的DML 语句的信息
隐式游标的属性有:
%FOUND – SQL 语句影响了一行或多行时为 TRUE
%NOTFOUND – SQL 语句没有影响任何行时为TRUE
%ROWCOUNT – SQL 语句影响的行数
%ISOPEN - 游标是否打开,始终为FALSE

显示游标

显式游标用于处理返回多行的查询。

显式游标在 PL/SQL 块的声明部分定义查询,该查询可以返回多行
显式游标的操作过程:

在这里插入图片描述
声明游标:CURSOR …IS select…
打开游标:OPEN
结果集控制:FETCH…INTO…
关闭游标:CLOSE
举例:

在这里插入图片描述

带参数的游标:

在这里插入图片描述
使用显式游标更新行使用显式游标更新行

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  new_price NUMBER;
  CURSOR cur_toy IS
    SELECT toyprice FROM toys WHERE toyprice<100
    FOR UPDATE OF toyprice;
BEGIN
  OPEN cur_toy;
  LOOP
    FETCH cur_toy INTO new_price;
    EXIT WHEN cur_toy%NOTFOUND;
    UPDATE toys
    SET toyprice = 1.1*new_price
    WHERE CURRENT OF cur_toy;
  END LOOP;
  CLOSE cur_toy;
  COMMIT;

循环游标

循环游标用于简化游标处理代码
当用户需要从游标中提取所有记录时使用
循环游标的语法如下:


FOR <record_index> IN <cursor_name>
LOOP
	<executable statements>
END LOOP;

REF 游标和游标变量

在变量声明部分定义的游标是静态的,不能在程序运行过程中修改。虽然可以通过参数传递来取得不同的数据,但还是有很大的局限性。通过采用动态游标,可以在程序运行阶段随时生成一个查询语句作为游标。要使用动态游标需要先定义一个游标类型,然后声明一个游标变量,游标对应的查询语句可以在程序的执行过程中动态地说明。

REF 游标和游标变量用于处理运行时动态执行的 SQL 查询
创建游标变量需要两个步骤:
声明 REF 游标类型
声明 REF 游标类型的变量
用于声明 REF 游标类型的语法为:

[TYPE <ref_cursor_name> IS REF CURSOR
	[RETURN <return_type>];

在这里插入图片描述
游标变量的功能强大,可以简化数据处理。
游标变量的优点有:
可从不同的 SELECT 语句中提取结果集
可以作为过程的参数进行传递
可以引用游标的所有属性
可以进行赋值运算
使用游标变量的限制:
不能在程序包中声明游标变量
FOR UPDATE子句不能与游标变量一起使用
不能使用比较运算符

bulk 的好处
https://blog.csdn.net/qq_34745941/article/details/105984582

从技术底层看,两者是相同的。普通plsql cursor在定义时是“静态”的。而Ref cursors可以动态打开。 Ref
cursor根据逻辑动态打开;而游标cursor定义好了就无法修改了 ref cursor可以返回给客户端,cursor则不行。
cursor可以是全局的global ,ref cursor则必须定义在过程或函数中。 ref
cursor可以在子程序间传递,cursor则不行。 cursor中定义的静态sql比ref cursor效率高,所以ref
cursor通常用在:向客户端返回结果集。

总结
游标用于处理查询结果集中的数据
游标类型有:隐式游标、显式游标和 REF 游标
隐式游标由 PL/SQL 自动定义、打开和关闭
显式游标用于处理返回多行的查询
显式游标可以删除和更新活动集中的行
要处理结果集中所有记录时,可使用循环游标
在声明 REF 游标时,不需要将 SELECT 语句与 其关联

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值