PL/SQL 04 游标 cursor
--游标
declare
cursor 游标名字
is
查询语句;
begin
其他语句;
end;
--游标的属性
%FOUND
%NOTFOUND
%ISOPEN
%ROWCOUNT(当前游标的指针位移量)
--FETCH的两种形式
FETCH cursor_name INTO var1, var2, …;
FETCH cursor_name INTO record_var;
--游标的FETCH循环
LOOP
FETCH cursor INTO…
EXIT WHEN cursor%NOTFOUND;
END LOOP
WHILE cursor%FOUND LOOP
FETCH cursor INTO…
END LOOP
FOR var IN cursor LOOP
FETCH cursor INTO…
END LOOP
--如果使用了PL/SQL变量在select_statement中, 变量的声明必须放在游标前面
v_major students.major%TYPE;
DELCARE
CURSOR c_student IS
SELECT first_name, last_name
FROM students
WHERE major = v_major;
--CURSOR可以带参数
DECLARE
CURSOR c_student(p_major students.major%TYPE) --注意返回类型
SELECT *
FROM students
WHERE major = p_major;
BEGIN
OPEN c_student( 101 );
…
--游标举例
declare
cursor cur_teaname
is
select teaname from t_teacher where teatitle='教授';
teanme t_teacher.teaname%type;
result varchar2(100);
begin
open cur_teaname;
loop
fetch cur_teaname into teaname;
exit when cur_teaname%notfound;
result:=result||teaname||' ';
end loop;
dbms_output.put_line(result);
close cur_teaname;
end;
带参数的游标
IKKI@ test10g> edit
Wrote file ././././afiedt.buf
1 declare
2 cursor cust_cursor(p_cust_id int,p_last_name varchar2)
3 is
4 select cust_id,first_name,last_name,credit_limit
5 from customer
6 where cust_id=p_cust_id
7 and last_name=p_last_name;
8 customer_record customer%rowtype;
9 begin
10 open cust_cursor('&id','&lname');
11 loop
12 fetch cust_cursor into customer_record;
13 exit when cust_cursor%notfound;
14 dbms_output.put_line(customer_record.cust_id||':'||customer_record.last_name);
15 end loop;
16 close cust_cursor;
17* end;
IKKI@ test10g> /
Enter value for id: 1
Enter value for lname: smith
old 10: open cust_cursor('&id','&lname');
new 10: open cust_cursor('1','smith');
1:smith
PL/SQL procedure successfully completed.
使用游标更新数据
IKKI@ test10g> edit
Wrote file ././././afiedt.buf
1 declare
2 cursor test_cursor is
3 select ddh,ydrq,jfrq from test for update;
4 test_record test%rowtype;
5 begin
6 open test_cursor;
7 loop
8 fetch test_cursor into test_record;
9 exit when test_cursor%notfound;
10 dbms_output.put_line('ddh:'||test_record.ddh||',ydrq:'||test_record.ydrq||',jfrq:'||test_record.jfrq);
11 if test_record.jfrq-test_record.ydrq>15 then
12 update test set jfrq=ydrq+15 where current of test_cursor;
13 end if;
14 end loop;
15 close test_cursor;
16* end;
IKKI@ test10g> /
ddh:601,ydrq:01-MAY-90,jfrq:30-MAY-90
ddh:600,ydrq:01-MAY-90,jfrq:29-MAY-90
PL/SQL procedure successfully completed.
IKKI@ test10g> select * from test;
DDH YDRQ JFRQ
---------- ------------ ------------
601 01-MAY-90 16-MAY-90
600 01-MAY-90 16-MAY-90
--用for循环简化的游标
for 记录变量名 in 游标名字 loop
代码;
end loop;
create or replace function fun_get_teaname(title varchar2)
return varchar2
as
cursor cur_teaname
is
select teaname from t_teacher where teatitle=title;
result varchar2(100);
begin
for rec in cur_teaname loop
result:=result||rec.teaname||' ';
end loop;
return(result);
end;
--存储过程和游标配合使用
create or replace procedure test1(j emp.job%type)
as
cursor test
is select empno,ename from emp where job=j;
eno emp.empno%type;
ena emp.ename%type;
begin
open test;
loop
fetch test into eno,ena;
exit when test%notfound;
dbms_output.put_line(eno||' '||ena);
end loop;
close test;
end;
PL/SQL 04 游标 cursor的更多相关文章
- PL/SQL使用游标CURSOR
一.使用游标 对于DML语句和单行select into ,oracle自动分配隐形游标.处理select返回多行语句,可以使用显式游标. 使用显示游标处理多行数据,也可使用SELECT..BULK ...
- PL/SQL之--游标
一.游标简介 在PL/SQL中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),也称为缓冲区.游标是指向该区的一个指 ...
- Oracle PL/SQL,游标,过程
1.PL/SQL 语法相关 -- SQL 语言只是访问,操作数据库的语言,而比并不是程序设计语言,因此不能用于程序开发. -- PL/SQL 是在标准SQl语言上进行过程性扩展后形成的程序设计语言, ...
- orcale 之 PL/SQL的游标
根据我们之前了解到的情况,SQL是面向集合的,我们的查询结果一般包含多条数据,而在PL/SQL 中的变量一般只能存放一条数据,因此变量是无法满足我们的需求的.这时候我们就需要引入游标来为我们解决问题了 ...
- PL/SQL之游标的使用
Oracle中的游标有两种: 显式游标 用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理. 隐式游标 是在执行插入(INSERT).删除(DELETE) ...
- PL/SQL编程—游标
一.游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然 ...
- 在PL/SQL使用游标获取数据及动态SQL
1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2. 游标分类: A. 隐式游标 a. 在PL/ ...
- Oracle pl/sql 显示游标和隐式游标
显示游标 一.定义语法: CURSOR <游标名> IS <SELECT 语句> [FOR UPDATE | FOR UPDATE ...
- 学习使用MS SQL Server游标(CURSOR)
说实的,使用MS SQL Server这样久,游标一直没有使用过.以前实现相似的功能,都是使用WHILE循环加临时表来实现.刚才有参考网上示例练习写了一下.了解到游标概念与语法. 下面代码示例中,先是 ...
随机推荐
- AM5728通过GPMC接口与FPGA高速数据通信实现
硬件:AM5728开发板:Artix-7开发板软件:Linux am57xx-evm 4.4.19:Vivado 2015.2作者:杭州矢志信息科技有限公司邮箱:admin@sysjoint.com ...
- Hessian 2.0 序列化协议 - Hessian 2.0 Serialization Protocol 翻译
Hessian是一种轻量.快速的web协议,在微服务场景下经常被使用. Hessian协议实际上包含两种含义: 1. Web网络通信远程调用服务,具体可以参考:http://hessian.cauch ...
- POJ 2166 Heapsort(递推)
Description A well known algorithm called heapsort is a deterministic sorting algorithm taking O(n l ...
- ACM做题随做随思
程序停止运行:数组开太大: 输入一串单词,可以“string s; while(cin>>s){//代码块}”,因为cin>>s遇到空格会停止: map<key,valu ...
- 自定义Json格式
老铁们都知道,一般的json格式就是键值对格式,在一些特定的框架或者系统中,会用到自定义格式的json文件,假设我们要得到的特定格式json格式如下: {"A":"2&q ...
- ArcGis融合小多边形到相邻多边形
在有的时候,我们的数据中可能会有许多细小的图斑,这些并不是我们想要的,需要将它们合并到周围的图斑中,如果一个一个手动合并,那工作量之大简直不敢想象.现在借助ArcGIS的Eliminate工具可 ...
- [洛谷P1278]单词游戏
题目大意:给一个有$n(n\leqslant16)$个单词的字典,求单词接龙的最大长度 题解:发现$n$很小,可以状压,令$f_{i,j}$表示选的数的状态为$i$,最后一个字母是$j$的最大长度. ...
- WM_CTLCOLOR消息
文章参考地址:http://blog.csdn.net/hisinwang/article/details/8070393 在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOL ...
- P2764 最小路径覆盖问题
题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开 ...
- codeforces 1077D
题目:https://codeforces.com/contest/1077/problem/D 题意:给你一个长度为n的串,你需要在里面找到出现次数最多的长度为k的子序列(子序列中元素可重复),求这 ...