oracle游标的使用及属性
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
openmycursor;
fetchmycursorintocursorrecord;
ifmycursor%foundthen
dbms_output.put_line(to_char(cursorrecord.deptno);
else
dbms_outpu.put_line('没有数据');
endif;
这个解释更加精妙:
%NOTFOUNDis the logical opposite of%FOUND.%NOTFOUNDyieldsFALSEif thelastfetch returned a row, orTRUEif thelastfetch failed to return a row
错误的例子:
begin
tempsal:=800;
openmycursor;
fetchmycursorintocursorrecord;
ifmycursor%notfoundthen
dbms_output.put_line(to_char(cursorrecord.deptno);
else
dbms_output.put_line('发现数据');
fetch mycursor into cursorrecord;
dbms_output.put_line(to_char(cursorrecord.deptno));
end;
四:关闭游标
close 游标名;
Oracle
%isopen属性----测试游标是否打开,没打开的情况下使用fetch语句将提示错误。
end;
Oracle
该属性是%found属性的反逻辑,常被用于退出循环。
setserveroutputon
declare
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
nvarchar2(10);
begin
openv_cur;
loop
exitwhenv_cur%notfound;
n:='hehe'
fetchv_curinto n;
dbms_output.put_line(n);
closev_cur;
endloop;
end;
执行代码的结果:
hehe
疑问:游标是空游标,也就是说游标在打开的时候就没有指向任何的值。但为什么exitwhenv_cur%notfound;这条语句还通过了呢??
declare
tempsal scott.emp.sal%type;
cursor mycursor is select * from scott.emp where sal > tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal :=800;
open mycursor;
end;
二:打开游标
语法结构: open 游标名
打开游标分为两步: 1 将符合条件的记录送入内存 2 将指针指向第一条记录
三:提取游标数据
语法形式: fetch 游标名 into 变量名1,变量名2,.....; 或者
fetch 游标名 into 记录型变量名;
示例:
set serveroutput on
oracle游标的使用
oracle
游标是从数据表中提取出来的数据,以临时表的形式存放到内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作, 然后将操作结果写回到数据库中。
一:定义游标
cursor 游标名 is select 语句;
EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;
也就是说v_cur%notfound有三种状态,true,false,null。所以以后为了安全期间可以加上是否为空的判断
Oracle
该属性用于返回游标的数据行数。
setserveroutputon
declare
示例:
setserveroutputon
declare
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
begin
tempsal:= 800;
dbms_output.put_line(to_char(mycursor%rowcount));
end;
若返回值为0 表明游标已经打开,但没有提取出数据。
发现了另一个疑问:
把a,b都fetch之后按理说游标已经空了,那么第三次应该是fetch的空值,为什么打印出来的还是b呢??
因为fetch..into语句末尾不会修改into变量后面的值。就像select..into如果没有数据会报异常,但是不会把into后面的变量置为空
再写一段代码
declare
cursorv_curisselectnamefromtableAwhere name = 'c';
closev_cur;
endloop;
end;
执行上面的语句,结果为:
a
b
b
发现最后一条记录被打印了两次。原因是%notfound是判断最后一次fetch的结果,把bfetch到变量n中之后再执行exit when %notfound判断得到的是false的记过,也就是说是有返回行的,所以判断通过,再此执行了打印语句。
oracle文档的解释:
Before the first fetch,%NOTFOUNDreturnsNULL. IfFETCHnever executes successfully, the loop is never exited, because theEXITWHENstatementexecutes only ifitsWHENcondition is true. To be safe, you might want to use the followingEXITstatement instead:
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
begin
tempsal:=800;
openmycursor;
fetchmycursorintocursorrecord;
示例:
set serveroutput on
declare
tempsal scott.emp.sal%type;
cursor mycursor is select * from scott.emp where sal > tempsal;
begin
tempsal :=800;
open mycursor;百度文库
endif;
end;
%notfound的理解
文档中的解释:It returnsTRUEif anINSERT,UPDATE, orDELETEstatement affected no rows, or aSELECTINTOstatement returned no rows. Otherwise, it returnsFALSE.
tableA
id name
1 a
2 b
declare
cursorv_curisselectnamefromtableA;
nvarchar2(10);
begin
openv_cur;
loop
exitwhenv_cur%notfound;
fetchv_curinto n;
dbms_output.put_line(n);
ifmycursor%isopenthen
dbms_output.putline(to_char(cursorrecord.deptno);
else
dbms_output.put_line('游标没有打开');
endif;
end;
Oracle
该属性是测试前一个fetch语句是否有值,有值将返回true ,不然false.
示例:
setserveroutpuon
declare
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
begin
tempsal:= 800;
fetchmycursorintocursorrecord;
ifmycursor%foundthen
dbms_output.put_line(to_char(cursorrecord.deptno);
else
dbms_outpu.put_line('没有数据');
endif;
这个解释更加精妙:
%NOTFOUNDis the logical opposite of%FOUND.%NOTFOUNDyieldsFALSEif thelastfetch returned a row, orTRUEif thelastfetch failed to return a row
错误的例子:
begin
tempsal:=800;
openmycursor;
fetchmycursorintocursorrecord;
ifmycursor%notfoundthen
dbms_output.put_line(to_char(cursorrecord.deptno);
else
dbms_output.put_line('发现数据');
fetch mycursor into cursorrecord;
dbms_output.put_line(to_char(cursorrecord.deptno));
end;
四:关闭游标
close 游标名;
Oracle
%isopen属性----测试游标是否打开,没打开的情况下使用fetch语句将提示错误。
end;
Oracle
该属性是%found属性的反逻辑,常被用于退出循环。
setserveroutputon
declare
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
nvarchar2(10);
begin
openv_cur;
loop
exitwhenv_cur%notfound;
n:='hehe'
fetchv_curinto n;
dbms_output.put_line(n);
closev_cur;
endloop;
end;
执行代码的结果:
hehe
疑问:游标是空游标,也就是说游标在打开的时候就没有指向任何的值。但为什么exitwhenv_cur%notfound;这条语句还通过了呢??
declare
tempsal scott.emp.sal%type;
cursor mycursor is select * from scott.emp where sal > tempsal;
cursorrecord mycursor%rowtype;
begin
tempsal :=800;
open mycursor;
end;
二:打开游标
语法结构: open 游标名
打开游标分为两步: 1 将符合条件的记录送入内存 2 将指针指向第一条记录
三:提取游标数据
语法形式: fetch 游标名 into 变量名1,变量名2,.....; 或者
fetch 游标名 into 记录型变量名;
示例:
set serveroutput on
oracle游标的使用
oracle
游标是从数据表中提取出来的数据,以临时表的形式存放到内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作, 然后将操作结果写回到数据库中。
一:定义游标
cursor 游标名 is select 语句;
EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;
也就是说v_cur%notfound有三种状态,true,false,null。所以以后为了安全期间可以加上是否为空的判断
Oracle
该属性用于返回游标的数据行数。
setserveroutputon
declare
示例:
setserveroutputon
declare
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
begin
tempsal:= 800;
dbms_output.put_line(to_char(mycursor%rowcount));
end;
若返回值为0 表明游标已经打开,但没有提取出数据。
发现了另一个疑问:
把a,b都fetch之后按理说游标已经空了,那么第三次应该是fetch的空值,为什么打印出来的还是b呢??
因为fetch..into语句末尾不会修改into变量后面的值。就像select..into如果没有数据会报异常,但是不会把into后面的变量置为空
再写一段代码
declare
cursorv_curisselectnamefromtableAwhere name = 'c';
closev_cur;
endloop;
end;
执行上面的语句,结果为:
a
b
b
发现最后一条记录被打印了两次。原因是%notfound是判断最后一次fetch的结果,把bfetch到变量n中之后再执行exit when %notfound判断得到的是false的记过,也就是说是有返回行的,所以判断通过,再此执行了打印语句。
oracle文档的解释:
Before the first fetch,%NOTFOUNDreturnsNULL. IfFETCHnever executes successfully, the loop is never exited, because theEXITWHENstatementexecutes only ifitsWHENcondition is true. To be safe, you might want to use the followingEXITstatement instead:
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
begin
tempsal:=800;
openmycursor;
fetchmycursorintocursorrecord;
示例:
set serveroutput on
declare
tempsal scott.emp.sal%type;
cursor mycursor is select * from scott.emp where sal > tempsal;
begin
tempsal :=800;
open mycursor;百度文库
endif;
end;
%notfound的理解
文档中的解释:It returnsTRUEif anINSERT,UPDATE, orDELETEstatement affected no rows, or aSELECTINTOstatement returned no rows. Otherwise, it returnsFALSE.
tableA
id name
1 a
2 b
declare
cursorv_curisselectnamefromtableA;
nvarchar2(10);
begin
openv_cur;
loop
exitwhenv_cur%notfound;
fetchv_curinto n;
dbms_output.put_line(n);
ifmycursor%isopenthen
dbms_output.putline(to_char(cursorrecord.deptno);
else
dbms_output.put_line('游标没有打开');
endif;
end;
Oracle
该属性是测试前一个fetch语句是否有值,有值将返回true ,不然false.
示例:
setserveroutpuon
declare
tempsalscott.emp.sal%type;
cursormycursoris select * fromscott.empwheresal>tempsal;
cursorrecordmycursor%rowtype;
begin
tempsal:= 800;