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);--输出 “插入后:1”
END;
显式游标:
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 查询语句;