PL/SQL中如何使SQL游标文件夹返回第一行

路上风景正好,天上太阳正晴。
博客已停止维护。
Oracle中的游标有两种:
    用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理。
    是在执行插入(INSERT)、删除(DELETE)、修改(UPDATE)和返回单条记录的查询(SELECT)语句时有PL/SQL自动定义的。
1、显式游标操作
  显式游标在块定义部分、包或子程序中声明。当声明了显式游标后,可通过下面三条命令控制显式游标操作。  1)打开游标  2)推进游标  3)关闭游标
--声明显式游标
声明显式游标就是指定游标名和与它关联的SELECT语句,其语法如下:
CURSOR cursor_name[(parameter[,parameter]...)][RETURN return_type] IS select_
parameter子句语法:
cursor_parameter_name[IN]datatype[{:=|DEFAULT} expr]
cursor_name是游标名,必须符合PL/SQL标识符的命名规范;
return_type 是游标返回的查询结果集类型,它只能是一个PL/SQL记录类型或数据库表的某一列的类型。
select_statement是游标中的SELECT语句,在游标中指定的SELECT语句可以带有UNION、MINUS或INTERSECT子句。select_statement不能含有INTO子句,查询结果是用FETCH语句中的INTO子句送给变量的。
将PL/SQL变量绑定在游标的WHERE子句中
v_auths auths%ROWTYPE;
v_code auths.author_code%TYPE;
CURSOR c_auths IS
SELECT * FROM auths
WHERE author_code=v_
因为声明游标时将PL/SQL变量绑定在WHERE子句中,所以游标的声明必须在这些变量的作用域内,同时先声明变量在声明显式游标。
将游标参数绑定在游标的WHERE子句中
CURSOR c_auths(p_code auths.author_code%TYPE;) IS
SELECT * FROM auths
WHERE author_code=p_
游标参数的作用域只局限在游标声明所指定的查询中,并且游标可以赋缺省值。
--打开显式游标
处理:先查找绑定在游标中的变量,然后按照该变量的值确定查询结果集。
OPEN cursor_name [(parameter[,parameter]...)]
cursor_name是已声明的游标的名;
parameter是绑定的实参;
--在打开游标前为绑定的变量赋值
v_code:='A0001';
--打开游标
如果打开游标后,在为改变量赋值,查询结果集不发生任何改变。这是因为结果集在游标打开时被确定,同时指向结果集的指针也被确定。
--打开游标时将参数传入
OPEN c_auths('A0001');
--推进显式游标
使用FETCH语句来推进游标,返回查询结果集中的一行,没执行完一条FETCH语句后,显式游标会自动指向查询结果集的下一行。
FETCH cursor_name INTO list_of_
FETCH cursor_name INTO PL/SQL_
cursor_name是已声明的游标的名
list_of_variables是已声明的变量列表
PL/SQL_record是已定义好的PL/SQL记录
INTO子句中的变量必须与游标SELECT语句中相应表列的类型兼容(一致或可以自动转换)
--关闭显式游标
当整个结果集都检索完以后,应当关闭游标,释放游标所占用的资源。
CLOSE cursor_name
游标处于关闭状态时,推进游标时错误的,错误信息如下:
ORA-1001:Invalid CURSOR
ORA-1002:Fetch out of Sequence
如果关闭游标有又执行关闭游标命令,还会提示ORA-1001错误。
2、游标的属性
一个返回布尔值得属性,如果FETCH语句返回了一行,则该属性返回true,否则返回false。
如果在打开游标之前或关闭游标之后使用该属性,会提示ORA-1001错误。当打开游标后没有使用FETCH语句推进,则返回NULL;
与%FOUND意思相反,如果FETCH语句返回了一行,则改属性返回false,否则返回true。其它和%FOUND相同。
用来确定相关游标是否打开,如果游标已打开,则返回true,否则返回
返回游标推进的行数。如果在打开游标之前或关闭游标之后使用该属性,会提示ORA-1001错误。
3、显式游标的推进循环
--声明一个变量,这个变量用来接收游标返回的结果集。
v_Salary Auths.salary%TYPE;
v_Code Auths.author_code%
--声明游标,结果集为作家代码A0001到A0006的工资值
CURSOR c_salary IS
SELECT salary,author_code
FROM auths
WHERE author_code&='A0006'
--打开游标,并初始化结果集
--推进游标,将游标的查询结果集中的一行存到变量v_salary中。
FETCH c_salary INTO v_Salary,v_C
--当结果集中没有夯实退出循环。
EXIT WHEN c_salary%NOTFOUND;
IF v_Salary&=200 THEN
UPDATE auths SET salary=salary=50;
WHERE author_code=v_C
--关闭游标
--提交所做修改
PL/SQL还提供了一种简单类型的循环,可以自动控制游标的打开、推进和关闭。
CURSOR c_salary IS
SELECT salary
FROM auths
WHERE author_code&='A0006'
--开始游标FOR循环,隐含地打开c_salary游标。
FOR v_salary IN c_salary LOOP
--一个隐含的FETCH语句在这里被执行
IF v_Salary&=200 THEN
UPDATE auths SET salary=salary=50;
WHERE salary=v_salary.
--循环继续前进,一个隐含的v_salary%NOTFOUND被检测。
--循环结束,c_salary游标的一个隐含的CLOSE操作被执行。
v_salary没有在块的定义部分声明,该变量被PL/SQL编译器隐含地声明了,该变量的类型为c_salary%ROWTYPE,其作用域只在循环内部。在循环开始,游标的c_salary被自动打开。在每一次自动推进后,%FOUND属性用来检查在结果集中是否还有行,当结果集中没有行时,游标被自动关闭。
使用CURRENT OF cursor_name子句作为条件。
--声明游标时在SELECT语句中必须加FOR UPDATE OF 子句
CURSOR c_salary IS
SELECT salary
FROM auths
WHERE author_code&='A0006' FOR UPDATE OF
FOR v_salary IN c_salary LOOP
IF v_Salary&=200 THEN
UPDATE auths SET salary=salary=50;
WHERE CURRENT OF c_
4、隐式游标处理(SQL游标)
当使用INSERT、DELETE或UPDATE语句处理一行或多行,或换行SELECT INTO 语句返回一行时,返回true,否则返回
如果执行SELECT INTO语句时返回多行,则会产生TOO_MANY_ROWS异常,并将控制权转到异常处理部分,%FOUND属性并不返回true,如果执行SELECT INTO语句时返回0行,会产生NO_DATA_FOUND异常,%FOUND属性并不返回false。
与%FOUND属性相反,当使用INSERT、DELETE或者UPDATE语句处理的行数为0时,%NOTFOUND属性返回true,否则返回false。
因为在执行了DML语句后,Oracle会自动关闭SQL游标,所以该属性终为false。
该属性返回执行INSERT、DELETE或者UPDATE语句返回的行数,或返回执行SELECT INTO 语句时查询出的行数,如果INSERT、DELETE、UPDATE或者SELECT INTO语句返回的行数为0,则%ROWCOUNT属性返回0。但如果SELECT INTO语句返回的行数为多行,则产生TOO_MANY_ROWS异常,并将控制权转到异常处理部分,而不是去判断%ROWCOUNT属性。
UPDATE auths
SET entry_date_time=SYSDATE
WHERE author_code='A0001';
IF SQL%NOTFOUND THEN
INSERT INTO auths(author_code,name,entry_date_time) VALUES('A0001','张三',SYSDATE);
SET SERVEROUTPUT ON
v_birthdate DATE;
SELECT birthdate INTO v_birthdate
FROM auths
WHERE name='张三';
IF SQL%FOUND THEN
DELETE FROM auths WHERE name='张三';
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('该记录不存在');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('存在多条记录');
5、游标变量
  这部分内容以后补上。
阅读(...) 评论()特殊的案例不足以特殊到破坏规则,尽管实践可以打破真理,错误却不可置之不理,除非另有明确要求。面对模菱两颗,拒绝猜测,总会有有一个显而易见的方式来明辨。...
plsql游标最后一行重复的问题
大家仔细看一下,下面第一个存储过程,test01,有没问题?
看似没问题,其实会造成重复行,test02将exit when的语句放到合适的位置上来。就不会出现最后一行重复打印的问题。
create or replace procedure test01 as
cursor cursor1 is
select * from v$session where rownum &= 5;
record1 cursor1%
DBMS_OUTPUT.ENABLE(buffer_size =& null);
open cursor1;
fetch cursor1 into record1;
dbms_output.put_line(record1.sid);
exit when cursor1%
close cursor1;
-----------------------------------------------------------------------
create or replace procedure test02 as
cursor cursor1 is
select * from v$session where rownum &= 5;
record1 cursor1%
DBMS_OUTPUT.ENABLE(buffer_size =& null);
open cursor1;
fetch cursor1 into record1;
exit when cursor1%
dbms_output.put_line(record1.sid);
close cursor1;
三种批量删除PLSQL写法效率的比对
没有更多推荐了,PL/SQL游标为程序提供了从数据库中选择多行数据,然后对每行数据单独进行处理的方法,它为Oracle提供了一种指示和控制SQL处理的各个阶段的方法。
游标的创建
游标的处理
定义和使用游标属性
一、 什么是游标
Oracle使用两种游标:显式游标和隐式游标。不管语句返回多少条纪录,PL/SQL为使用的每一条UPDATE、DELETE和INSERT等SQL命令隐式的声明一个游标。(要管理SQL语句的处理,必须隐式的给它定义一个游标。)用户声明并使用显示游标处理SELECT语句返回的多条记录。显示的定义游标一种结构,它使用户能够为特定的语句指定内存区域,以便以后使用。
PL/SQL维护,当执行查询时自动打开和关闭
在程序中显式定义、打开、关闭,游标有一个名字。
游标属性前缀是SQL
游标属性的前缀是游标名
属性%ISOPEN总是为FALSE
%ISOPEN根据游标的状态确定值
SELECT语句带有INTO子串,只有一行数据被处理
可以处理多行数据,在程序中设置循环,取出每一行数据。
二、 游标的作用
当PL/SQL游标查询返回多行数据时,这些记录组被称为活动集。Oracle将这种活动集存储在您创建的显示定义的已命名的游标中。Oracle游标是一种用于轻松的处理多行数据的机制,没有游标,Oracle开发人员必须单独地、显式地取回并管理游标查询选择的每一条记录。
游标的另一项功能事,它包含一个跟踪当前访问的记录的指针,这使您的程序能够一次处理多条记录。
三、 使用显示游标的基本方法
步骤如下:
从游标中取回数据
1、声明游标
声明游标的语法如下:
DECLARE cursor_name
SELECT statement
其中,cursor_name是您给游标指定的名称;SELECT statement是给游标活动集返回记录的查询。
声明游标完成了下面两个目的:
给游标命名;
将一个查询与游标关联起来。
值得注意的是,必须在PL/SQL块的声明部分声明游标;给游标指定的名称是一个未声明的标识符,而不是一个PL/SQL变量,不能给游标名称赋值,也不能将它用在表达式中。PL/SQL块使用这个名称来引用游标查询。
例:DECLARE
SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM&=10;
另外还可以在游标定义语句中声明游标的参数,例:
CURSOR c1(view _nbr number)
SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM&= view _nbr;
游标参数只对相应的游标是可见的,不能在游标范围之外引用该游标的参数。如果试图这样做,Oracle将返回一个错误,指出该变量没有定义。
2、打开游标
打开游标的语法如下:
OPEN cursor_name;
其中cursor_name是您以前定义的游标名称。
打开游标将激活查询并识别活动集,可是在执行游标取回命令之前,并没有真正取回记录。OPEN命令还初始化了游标指针,使其指向活动集的第一条记录。游标被打开后,直到关闭之前,取回到活动集的所有数据都是静态的,换句话说,游标忽略所有在游标打开之后,对数据执行的SQL DML命令(INSERT、UPDATE、DELETE和SELECT)。因此只有在需要时才打开它,要刷新活动集,只需关闭并重新打开游标即可。
3、从游标中取回数据
FETCH命令以每次一条记录的方式取回活动集中的记录。通常将FETCH命令和某种迭代处理结合起来使用,在迭代处理中,FETCH命令每执行一次,游标前进到活动集的下一条记录。
FETCH命令的语法:
FETCH cursor_name INTO record_list;
其中,cursor_name是前面定义的游标的名称;record_list是变量列表,它接受活动集中的列。FETCH命令将活动集的结果放置到这些变量中。
执行FETCH命令后,活动集中的结果被取回到PL/SQL变量中,以便在PL/SQL块中使用。每取回一条记录,游标的指针就移向活动集的下一条记录。
FETCH C1 INTO VNAME;
WHILE C1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||' '||VNAME);
其中,使用属性'%FOUND'使得当FETCH到达活动集的结尾时,不会引发异常。其它属性及含义见下表:
%FOUND 布尔型属性,当最近一次该记录时成功返回,则值为TRUE
%NOTFOUND 布尔型属性,它的值总与%FOUND属性的值相反
%ISOPEN 布尔型属性,当游标是打开时返回TRUE
%ROWCOUNT 数字型属性,返回已从游标中读取的记录数
%FOUND 布尔型属性,当最近一次该记录时成功返回,则值为TRUE
%NOTFOUND 布尔型属性,它的值总与%FOUND属性的值相反
%ISOPEN 布尔型属性,当游标是打开时返回TRUE
%ROWCOUNT 数字型属性,返回已从游标中读取的记录数
4、关闭游标
CLOSE语句关闭以前打开的游标,使得活动集不确定。当用户的程序或会话结束时,Oracle隐式关闭游标。游标被关闭后,就不能对它执行任何操作了,否则将引发异常。
CLOSE语句的语法是:
CLOSE cursor_name;
其中,cursor_name是以前打开的游标的名称。
完整的程序代码如下:
CURSOR C1 IS SELECT VIEW_NAME FROM ALL_VIEWS
WHERE ROWNUM&=10
ORDER BY VIEW_NAME;
VNAME VARCHAR2(40);
FETCH C1 INTO VNAME;
WHILE C1%FOUND LOOP
DBMS_OUTPUT.PUT_LINE(TO_CHAR(C1%ROWCOUNT)||''||VNAME);
……CLOSE C1;
游标是一种结构,能够以一次一条记录的方式处理多行查询的结果.为每条DML语句创建隐式游标,而显式游标是由用户创建的,以便处理返回多条记录的查询。而且,通过消除反复地分析代码,游标提高了代码的处理速度。
浏览: 70439 次
来自: 北京
直接打开而不是弹出下载框的功能你测试过吗??还有你那个URL到 ...
为啥非得进行两次编码!
希望可以提供更多,阻塞解决的方法
谢谢,我就是这样解决,非常感谢
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'PL/SQL中不用游标如何实现每次获取一个表中的一行?
[问题点数:20分,结帖人lys]
本版专家分:0
结帖率 97.37%
CSDN今日推荐
本版专家分:10320
2012年8月 MS-SQL Server大版内专家分月排行榜第二
2012年9月 MS-SQL Server大版内专家分月排行榜第三
本版专家分:9845
2012年9月 Oracle大版内专家分月排行榜第一2012年8月 Oracle大版内专家分月排行榜第一
2012年10月 Oracle大版内专家分月排行榜第二2012年7月 Oracle大版内专家分月排行榜第二
本版专家分:2
本版专家分:15845
本版专家分:217
匿名用户不能发表回复!|
其他相关推荐PL/SQL 语句块初次接触(游标使用,实现loop的continue)
语句块结构
包含三部分:声明部分、执行部分和异常部分,其中执行部分是必须的,声明和异常部分是可选的。
--声明语句BEGIN
--执行语句EXCEPTION
--异常语句END;
oracle 语句块,没有continue功能,可以用goto 实现:
下午写的一个简单的语句块功能:
create table tmp_fjx
MPOLICYNO CHAR(15),
CLASSCODE CHAR(6),
BEGINDATE DATE
TMP_POLICYNO
CURSOR c_policyno IS
select b.policyno mpolicyno,b.policyno,b.classcode,b.begdate
from riskcon a,riskcon b
where a.policyno=b.policyno
and a.appf='1' and b.appf='2'
select b.policyno mpolicyno,b.policyno,b.classcode,b.begdate
from appnext a ,riskcon b
a.policyno!=a.mpolicyno and length(a.policyno)=15 and length(a.mpolicyno)=15
and a.policyno=b.policyno and a.classcode=b.classcode and b.appf='2'
TMP_POLICYNO :='';
FETCH c_policyno INTO MPOLICYNO,POLICYNO,CLASSCODE,BEGINDATE;
EXIT WHEN c_policyno%NOTFOUND;
IF(MPOLICYNO != TMP_POLICYNO) THEN
insert into tmp_fjx values(MPOLICYNO,POLICYNO,CLASSCODE,BEGINDATE);
TMP_POLICYNO := MPOLICYNO;
COMMIT;EXCEPTION
WHEN OTHERS
oracle 循环语句总结(break&continue)
【DB.PL/SQL】程序流程控制 —— 循环 ——LOOP, END LOOP, WHILE, FOR, CONTINUE
sql server 游标continue,总是死循环
PLSQL:用exit代替continue
SqlServer游标中使用continue的注意事项
SQLServer帮助中心(SQL游标)
MySql CURSOR+LOOP循环-使用小实例
cursor游标(Mysql 存储过程之结果集的循环操作)
没有更多推荐了,}

我要回帖

更多关于 SQL中的游标 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信