【oracle】cursor 概念,cursor经典例子

摘要:
2) Refcursor没有参数,可以使用带变量的sql实现。3) 有两种方法可以在open中编写refcursor:为打开;为打开;显式游标只能用<select_ Statement>4定义。)因为referesor的特定sql语句是在打开时指定的,所以referesor不能使用for循环值。Refcursor遍历,值:与显式游标相同。

1118-01 cursor 概念,经典例子
类型
1.隐式游标
2.显式游标
3.ref cursor
4.sysref cursor

定义
1.隐式游标
无需定义,select语句即为隐式游标

2.显式游标
cursor <cursor>[(<param_list>)]is <select_statement>;
说明:
2.1 定义时不带参数,带参数
说明:
1)参数 只能指定 数据类型,不能指定长度。
2)参数可以用 default 设置默认值,设有默认值的游标在open时 可以 不带参数。
3)参数 通常用在 <select_statement> 中。
2.2 < select_statement >中 不带变量,带变量

3.ref cursor
3.1弱类型
type <cursor> is ref cursor;
3.2强类型
type <cursor> is ref cursor return tab_student%rowtype; --指定了return
注意:
1)创建procedure返回游标类型变量(out 参数)时,只能使用 ref cursor。
2)ref cursor没有参数,可以使用带变量的sql实现。
3)ref cursor在open时有2种写法:
open <ref_cursor> for <select_statement>;
open <ref_cursor> for <vv_sql>;
而显式游标的定义 只能用 is <select_statement>
4)因为ref cursor 的具体sql语句在open时指定,所以 ref cursor 不可以使用 for循环取值。

4.sys_refcursor


属性(4个)
1.found
2.notfound
3.rowcount
4.isopen
引用方式:
显式游标:<cursor>%<游标属性>
隐式游标:SQL%<游标属性>

注意:除了属性isopen外的其他3个属性 至少fetch一次,该属性才有值,即才可以使用。


遍历游标:取游标中的值
1. fetch <cursor> into <column_variable_list>;
2. fetch <cursor> into <行类型变量|记录类型变量>
说明:
<record> --记录类型 的 显示定义
<table>%rowtype -- 记录类型 的 隐式定义
<view>%rowtype -- 记录类型 的 隐式定义
<cursor>%rowtype -- 记录类型 的 游标定义
使用 <记录类型>.<column>取得行中列的值。
3. for循环中可以使用 循环计数变量.字段名


游标的使用流程:
1.定义
2.open
3.fetch
4.close
说明:for循环中,无需手动open,fetch,close。

例1.显式游标的定义(无参,有参,带变量,不带变量)

例2.游标属性(隐式,显式)

例3.显示游标的使用(遍历,取值)

例4.ref cursor的定义,使用
说明:
ref cursor定义与打开:定义用关键字type(显式游标的定义使用关键字 cursor);open时用关键字for指定SQL。
ref cursor的遍历,取值:与 显式游标 相同。


经典例子:
1.需求:按部门加薪
员工表,如果是10部门,员工加薪¥100;20部门,员工加薪¥200;30部门,员工加薪¥300。

set serveroutput on;

declare
cursor vc_emp(vp_emp_depart integer) is
select emp_id,emp_name,emp_depart,emp_salary from t_emp where emp_depart = vp_emp_depart;
begin
for i in 1..3 loop
for i_emp in vc_emp(i*10) loop
update t_emp set emp_salary=i_emp.salary*i*100 where emp_id = i_emp.emp_id;
end loop;
end loop;
commit;
exception
when others then
rollback;
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end;
/

2.需求:
存储过程返回ref cursor
调用存储过程,并遍历其返回的游标
alter session set plsql_warnings = 'enable:all';
set serveroutput on;

--定义包
create or replace package pkg_cur as
type lax_cursor is ref cursor; --弱类型
type strict_cursor is ref cursor return t_student%rowtype; --强类型
end pkg_cur;
/

show errors;

--定义存储过程
create or replace procedure prc_cur(
ii_sid in integer,
oc_cur out pkg_cur.lax_cursor
)
is
begin
open oc_cur for
select sid,name,age,gender from t_student where sid <= ii_sid;
exception
when others then
dbms_output.put_line(sqlcode||','||substr(sqlerrm,1,200));
end prc_cur;
/

--调用
set serveroutput on;
declare
vi_sid integer;
vc_cur pkg_cur.lax_cursor;
vt_table t_student%rowtype;
begin
v_sid := 2;
prc_cur(vi_sid,vc_cur);
if (vc_cur%isopen) then
dbms_output.put_line('vc_cur is opened.');
loop
fetch vc_cur into vt_table;
exit when vc_cur%notfound;
dbms_output.put_line(vt_table.sid||','||vt_table.name||','||vt_table.age||','||vt_table.gender);
end loop;
end if;
end;
/

免责声明:文章转载自《【oracle】cursor 概念,cursor经典例子》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇程序设计基石与实践系列之编写高效的C程序与C代码优化分布式下Session一致性问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

SQL中declare变量的作用域(续)一些问题

在上次讨论了declare变量的作用域以后我们继续深入谈论一下,准确的说是我有些疑惑想跟大家讨论,有高手明白的话指点一下。 关于作用域的谈论:http://www.cnblogs.com/breezeli/archive/2010/04/16/1713308.html 这个问题不太好解释,大家看一段代码,在循环中定义表变量。 注意 代码使用Northw...

ReactNative win10初体验

根据RN中文网上的文档搭建环境,有的地方说的不是很清楚,所以小白的我搞了很久,终于搭建成功,这里分享一下 1. java:   jdk和jre,我下载的是1.8(因为官方文档上说AndroidStudio需要1.8或更高版本),下载地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8...

shell 脚本 常用命令

Shell 脚本常用命令  Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook。在工作过程中整理了一下,贴在这里已备查看。 1           Shell中的特殊符号 1.1           $  美元符号。用来表示变量的值。如变量NAME的值为Mike,则使用$NAME就可以得到“Mike...

屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!

前阵子,Oracle 发布了一个黑科技 “GraalVM”,号称是一个全新的通用全栈虚拟机,并具有高性能、跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM 是一个跨语言的通用虚拟机,不仅支持了 Java、Scala、Groovy、Kotlin 等基于 JVM 的语言,以及 C、C++ 等基于 LLVM 的语言,还支持其他像 Jav...

postman 参数化详解

在接口测试中,部分参数每次发送请求是都要唯一的数值,这时可以采用把测试数据参数化处理的方式实现,postman参数化的形式主要有三种 1、内置变量实现 内建变量为postman自带的系统变量,但是不能进行精确化的对比 Variable Name Description Examples {{$guid}} 添加一个V4风格的GUID “611c...

MATLAB的基本元素

MALTAB程序的基本数据单元是数组,MATLAB 的变量名必须以字母开头,后面可以跟字母,数字和下划线(_).只有前31个字符是有效的;如果超过了31 个字符,基余的字符将被忽略。如果声明两个变量,两变量名只有第32 个字符不同,那么MATLAB 将它们当作同一变量对待。要注意的是:确保你所声明的变量名前31 个字符是独一无二的。否则,MATLAB 将无...