PLSQL游标使用
游标是一个指针,它指向一块SQL区域,该区域用于存储处理过来的SELECT或者其他的DML操作返回的数据。由PLSQL创建并管理的游标成为隐式游标,用户创建并管理的成为显示游标。游标可以看做是指向记录集合的指针,他可以在集合记录中移动以访问每条记录的功能。
显示游标的使用:
创建游标
CURSOR cursor_name IS sql_statement;
游标一旦创建成功,Oracle会为其分配内存,并与定义的SQL关联起来。
打开游标
OPEN cursor_name [argument,。。。];
获取数据
FETCH cusrsor_name INTO variblep[,varible];
①执行上述指令时,只能获取记录集合中的一行记录,将这行记录放入随后的变量中,这些变量的数据类型必须与记录中每列的数据类型相同。
关闭游标
CLOSE cursor_name
游标的属性
%ISOPEN:判断游标是否打开
%FOUND:游标是否发现数据
%NOTFOUND:游标没有发现数据
%ROWCOUNT:游标可以遍历的记录数量
访问游标属性的方法: cursor_name.attribute_name
游标使用实例:
DECLARE
var1 VARCHAR2(20);--变量的声明
var2 VARCHAR2(20);
CURSOR cursor_name IS SELECT * FROM table_name;--创建游标
BEGIN
OPEN cursor_name; --打开游标
LOOP --循环
FETCH cursor_name INTO var1,var2; --遍历游标 ***
dbms_output.put_line('bianlaing'||var1||'=='||var2);
EXIT WHEN cursor_name%NOTFOUND; --判断是否有数据
END LOOP; --循环结束
CLOSE cursor_name; --关闭游标
END;
①的解释var1 和 var2 必须和table_name表遍历结果集的数据类型分别对应
隐式游标的使用:
隐式游标是没有声明的游标,没有显示的创建游标只是在PLSQL代码块中执行SQL语句,这些语句就是隐式游标。
DECLARE
names VARCHAR2(10);
BEGIN
SELECT count(first_name) INTO names FROM emp;
dbms_output.put_line('count:='||names);
(这就是隐式游标)
END;
在用户每次运行select或者DML操作时,PLSQL会自动创建一个隐式游标,隐式游标无法控制,一旦涉及的SQL语句结束,隐式游标也会自动关闭。想要获得游标信息可以通过隐式游标的属性。
隐式游标的属性
SQL%ISOPEN:判断游标是否打开
SQL%FOUND:游标是否发现数据
SQL%NOTFOUND:游标没有发现数据
(该属性对于PLSQL的select into 语句没有用处,PLSQL认为其是一个非法操作,因为如果发生select into没有数据返回的情况,将会触发一个预定义异常NO_DATA_FOUND)
SQL%ROWCOUNT:用于发现游标中涉及的返回结果行的数量。
FOR游标
使用for游标不需要使用变量,也不需要显示的打开和关闭游标,这些是自动执行的,也不需要去fetch游标。
DECLARE
CURSOR cursor_nameIS SELECT * FROM table_name;--声明游标
BEGIN
FOR cursor_record IN cursor_name -for游标的使用
LOOP
dbms_output.put_line('变量'||cursor_record .chars||'=='||cursor_record .num);
END LOOP;
END;
For 游标语法中cursor_record 为一条记录的集合,他自动定义一个%ROWTYPE类型的变量,%ROWTYPE变量包含对应于记录中的多列变量,通过这个变量可以依次访问记录中的每个列值
游标表达式
Select deptno,dname,cursor(select empno,ename,sal from emp where deptno=d.deptno)from dept d;
游标变量/动态游标
像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行。游标变量显得更加灵活因为其声明并不绑定指定查询。
其主要运用于PLSQL函数或存储过程以及其他编程语言Java等程序之间作为参数传递。
不像游标的一点,游标变量没有参数。
游标变量具有以下属性:
(%FOUND, %NOTFOUND, %ISOPEN, and %ROWCOUNT)
1、声明格式:
DECLARE
TYPE ref_cursor_name IS REF CURSOR RETURN tablename%ROWTYPE;
游标变量又分为强类型strong(with a return type)和弱类型(with no return type):
TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE; -- 强类型
TYPE genericcurtyp IS REF CURSOR; -- 弱类型
my_cursor SYS_REFCURSOR; -- 使用预定义游标变量sys_refcursor
例子:
TYPE deptcurtyp IS REF CURSOR RETURN departments%ROWTYPE;
dept_cv deptcurtyp; -- 声明游标变量
或是返回record类型:
DECLARE
TYPE EmpRecTyp IS RECORD (
employee_id NUMBER,
last_name VARCHAR2(25),
salary NUMBER(8,2));
--声明record
TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp;
emp_cv EmpCurTyp;
使用游标变量最为参数传递
DECLARE
TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;
emp empcurtyp;
PROCEDURE process_emp_cv (emp_cv IN empcurtyp) IS --参数类型为游标类型
person employees%ROWTYPE;
OPEN emp FOR SELECT * FROM employees WHERE ROWNUM < 11;
process_emp_cv(emp);
CLOSE emp;
在包中声明游标变量
CREATE PACKAGE emp_data AS
TYPE empcurtyp IS REF CURSOR RETURN employees%ROWTYPE;
PROCEDURE open_emp_cv (emp_cv IN OUT empcurtyp);
END emp_data;
提取游标记录到集合类型
DECLARE
TYPE empcurtyp IS REF CURSOR;--声明动态游标
TYPE namelist IS TABLE OF employees.last_name%TYPE; --namelist集合
TYPE sallist IS TABLE OF employees.salary%TYPE;--sallist集合
emp_cv empcurtyp;
names namelist;--lsit -name
sals sallist;--list -sal
BEGIN
OPEN emp_cv FOR SELECT last_name, salary FROM employees
WHERE job_id = 'SA_REP';
FETCH emp_cv BULK COLLECT INTO names, sals; --BULK COLLECT INTO 的使用
CLOSE emp_cv;
FOR i IN names.FIRST .. names.LAST
LOOP
DBMS_OUTPUT.PUT_LINE('Name = ' || names(i) || ', salary = ' || sals(i));
END LOOP;
END;
通过bulk collect减少loop处理的开销
采用bulk collect可以将查询结果一次性地加载到collections中。
而不是通过cursor一条一条地处理。
可以在select into,fetch into,returning into语句使用bulk collect。
注意在使用bulk collect时,所有的into变量都必须是collections.
游标变量的使用限制
1、不能再包说明中声明游标变量;
2、不能用“=”运算符比较游标变量相等性、不等性及是否为空;
3、不能存储于表列中;
4、不能将游标变量存在于关联数组、嵌套表或数组;
5、游标和游标变量之前是不可互操作的!
PLSQL游标使用的更多相关文章
- PLSQL游标
静态游标:结果集已经确实(静态定义)的游标.分为隐式和显式游标 隐式游标:所有DML语句为隐式游标,通过隐式游标属性可以获取SQL语句信息: 显式游标:用户显式声明的游标,即指定结果集.当查询返回结果 ...
- SQL记录-PLSQL游标
PL/SQL游标 Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等. 游标是指向这一上下文的区域. PL/SQL通过控制光标 ...
- Oracle PLSQL游标、游标变量的使用
参考文章:https://www.cnblogs.com/huyong/archive/2011/05/04/2036377.html 在 PL/SQL 程序中,对于处理多行记录的事务经常使用游标来实 ...
- PLSQL开发笔记和小结(转载)
***************************************** PLSQL基本结构 ***************************************** 基本数据 ...
- Oracle之PLSQL总结
基本数据类型变量 1. 基本数据类型 Number 数字型 Int 整数型 Pls_integer 整数型,产生溢出时出现错误 Binary_integer 整数型,表示带符号 ...
- PLSQL开发笔记和小结
***************************************** PLSQL基本结构*****************************************基本数据类型变 ...
- PLSQL学习教程(全)
基于ORACLE9i+PL/SQLDeveloper7.1.4) 课程 一 PL/SQL 基本查询与排序 本课重点: 1.写SELECT语句进行数据库查询 2.进行数学运算 3.处理空值 4.使用别名 ...
- plsql oracle 使用教程
课程 一 PL/SQL 基本查询与排序 本课重点: 1.写SELECT语句进行数据库查询 2.进行数学运算 3.处理空值 4.使用别名ALIASES 5.连接列 6.在SQL PLUS中编辑缓冲,修改 ...
- Oracle存储过程、游标、函数
SQL99是什么 (1)是操作所有关系型数据库的规则 (2)是第四代语言 (3)是一种结构化查询语言 (4)只需发出合法合理的命令,就有对应的结果显示 SQL的特点 (1)交互性强,非过程化 (2)数 ...
随机推荐
- LPC1768的IIS通讯
IIS是飞利浦公司定义的一种用于音频传输的数字总线,LPC1768支持该总线, I2S接口为一条3线串行总线,含有1根数据线.1根时钟线和1根字选择信号线.基本的I2S连接具有一个主机(其总是为主机) ...
- iOS开发——Localizable.strings
这篇写的不多,但是绝对诚意满满.不会像别人一样,要不不详细,要不罗里吧嗦一堆. 1.创建Localizable.strings文件 Command+N—>iOS—>Resource—> ...
- 开启分布式事物DTC
1.web服务器开启分布式事物配置后,数据库服务器的host文件要设置 “IP web服务器主机名” 的映射,否则会 出现 “与基础事务管理器的通信失败” #跨网段使用TransactionSco ...
- 主流IOC框架测验(.NET)
上一篇中,我简单介绍了下Autofac的使用,有人希望能有个性能上的测试,考虑到有那么多的IOC框架,而主流的有:Castle Windsor.微软企业库中的Unity.Spring.NET.Stru ...
- CentOS6.5编译安装Redis
一.首先要检测是否安装gcc yum install gcc-c++ yum install -y tcl 进入redis目录 cd /usr/local/redis .编译安装 make make ...
- java系列--JSP的属性和内置对象
一.JSP指令: <%@ 指令名 属性=" " %> 1.page指令 import属性 errorPage属性 language属性 session属性 isErro ...
- delphi字符串操作函数一览
首部 function SameText(const S1, S2: string): Boolean; $[SysUtils.pas 功能 返回两个字符串是否相等 说明 不区分大小写 参考 < ...
- AngularJS中$http服务的简单用法
我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...
- 仿网易邮箱5.0(四):信息提示插件(tips.js)
信息提示插件,在平常的开发中也是经常乃至的一个插件,像是一些辅助信息的提示,如:加载成功.提交信息成功或失败等等.这个插件在163邮箱中用在切换标签时提示加载状态. 下面我们先来分析一下这个小插件需要 ...
- swift webView的高度自适应内容
废话不多 直接上代码 //在webView的协议方法里实现以下代码 func webViewDidFinishLoad(webView: UIWebView) {//加载完成 // se ...