Oracle游标

Oracle游标

游标:逐行处理查询结果,已编程的方式访问数据,类似于jdbc中的的ResultSet

游标类型:隐式游标,显式游标,REF(引用)游标

ref游标定义时不确定数据结构,而是再打开时给出查询语句,

隐式游标的属性有:

%ISOPEN –游标是否打开
对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。
%FOUND-SQL–语句影响了一行或多行在执行DML语句前值都是null,不影响任何行则返回FALSE否则返回TRUE,NOTFOUND则相反。
%NOTFOUND-SQL–语句没有影响任何行时为true在执行DML语句前值都是null
%ROWCOUNT-SQL–语句影响的行数

%FOUND
BEGIN 
     UPDATE TEXT SET NAME = '老李' where id = 4;
     if SQL%FOUND  THEN  --更改成功影响1行,则为true ,否则为false
        DBMS_OUTPUT.put_line('修改成功!');
     else
        DBMS_OUTPUT.put_line('没有id为4这个选项');
     end if;
end;
%ROWCOUNT
begin 
DBMS_OUTPUT.put_line('插入前:'||SQL%ROWCOUNT);--输出 “插入前:”
INSERT INTO TEXT VALUES (4,'隔壁老王',37,'搞破鞋',80000);
DBMS_OUTPUT.put_line('插入后:'||SQL%ROWCOUNT);--输出 “插入后:1END;
显式游标:
declare
cursor 游标名 select * from 表名;--声明游标
查询变量名 表名%rowtype; -- 查询变量名,类似于jdbc的结果集
begin
open 游标名;--打开游标
     loop
        fetch 游标名 into 查询变量名; --提取游标
        exit when 游标名%notfound;--退出循环游标
        --处理语句
        dbms_output.put_line(查询变量名.列名||查询变量名.列名||查询变量名.列名);
     end loop;
close 游标名;--关闭游标
end;
带参数的游标

带参数的游标只是在上面的前提下,在游标名的后面加了个参数。

declare
--声明游标,列名1必须相同,类似jdbc中的问号“?”
cursor 游标名(列名1 列名类型) is select * from 表名 where 列名 =列名1;
查询变量名 表名%rowtype;
begin
open 游标名(where条件);--打开游标,where条件相当于给“?”赋值,也就是列名1
     loop
        fetch 游标名into 查询变量名; --提取游标
        exit when 游标名%notfound;--判断游标是否取完,无则退出循环游标
       --处理语句
        dbms_output.put_line(查询变量名.列名||查询变量名.列名||查询变量名.列名);
     end loop;
close 游标名;--关闭游标
end;
for循环带参数的游标

只是改变了“方法体”。

declare
cursor 游标名(列名1 列名类型) is select * from 表名 where 列名 =列名1;
查询变量名 表名%rowtype;--可以省略,自动声明
begin
--for循环帮你打开和关闭游标,并自动提取
     for 查询变量名 in 游标名(where条件);
     loop
        --处理语句
        dbms_output.put_line(查询变量名.列名||查询变量名.列名||查询变量名.列名);
     end loop;
end;
例子:
--for循环带参数的游标
declare
cursor text_v(v_ID number) is select * from text where id =v_ID;--声明游标
textRow text%rowtype;--可以省略,自动声明
begin
--for循环帮你打开和关闭游标,并自动提取
     for textRow in text_v(2)
     loop
        dbms_output.put_line('id'||textRow.ID||'姓名'||textRow.NAME||'年龄'||textRow.AGE||'工作'||textRow.JOB||'工资'||textRow.SALARY);
     end loop;
end;
使用显式游标更新行
declare
cursor 游标名 is select * from 表名 for update ;
begin
       FOR 查询变量名IN 游标名-- 用循环游标读取游标内容
       loop
           IF 查询变量名.列名 =条件(相当于where语句)  then
           update 表名 set 列名 = '更改值' where current of 游标名;
           end if;
       end loop;
end;
引用游标:

1:引用游标用于根据业务需求确定查询语句。
2:只定义游标类型或返回结果的结构。
3:不定义查询语句。
4:分类:弱类型,强类型。
使用:
1:定义引用游标类型。
2:使用定义的游标类型声明一个变量。
3:打开游标时关联一个查询语句。

声明弱类型的ref游标
declare
 	 type 游标类型名 is ref cursoe;--定义类型
 	 游标变量名 游标类型名;--使用类型定义游标变量
begin
	OPNE 游标变量名 FRO 查询语句; 	 
声明强类型的ref游标
declare
--定义类型,指定游标查询语句返回的结构,即表结构
 	 type 游标类型名 is ref cursoe return 表名%rowtype;--定义类型
 	 游标变量名 游标类型名;--使用类型定义游标变量
begin
	OPNE 游标变量名 FRO 查询语句; 	 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值