重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
第二步是打开游标,即执行FOR后面的那句select语句 ,将结果正式查询出来加载到内存中,这时游标curRESULT里就正式有数据了。
10年积累的网站建设、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有贵阳免费网站建设让你可以放心的选择与我们合作。
第三步是把游标结果集中当前数据记录的多个字段一个一个的赋值给几个变量,当然如果结果集和几个变量的变量个数和变量类型必须是一样的,如果不一样会出错。
第四步curRESULT%FOUND是判断curRESULT这个游标循环到当前记录是否还有记录存在。FETCH下移是移动到下一条记录,如果当前记录已经是最后一条,那他会下移到一条界外的虚拟记录,这时当你用curRESULT%FOUND去判断的时候会得到FALSE,这就是刚才为什么我们要判断curRESULT%FOUND的原因了。
在定义参数游标之后,当使用不同参数值多次打开游标时,可以产生不同的结果集,语法如下:
cursor
cursor_name(parameter_name
datatype)
is
select_statement;
定义参数游标时,游标参数只能指定数据类型,而不能指定长度。
示例如下:
declare
cursor
temp_cursor(no
number)
is
select
name
from
cip_temps
where
id=no;
v_name
cip_temps.name%type;
begin
open
temp_cursor(1);
loop
一
游标是什么
游标字面理解就是游动的光标。
用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等。
二
游标的分类
显式游标和隐式游标
显式游标的使用需要4步:
1.
声明游标
CURSOR
mycur(vartype
number)
is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no
=
vartype;
2.
打开游标
open
mycur(000627)
注:000627是参数
3.
读取数据
fetch
mycur
into
varno,
varprice;
4.
关闭游标
close
mycur;
三
游标的属性
oracle
游标有4个属性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。
%ISOPEN判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false;
%FOUND
%NOTFOUND判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false;
%ROWCOUNT返回当前位置为止游标读取的记录行数。
四
示例
set
serveroutput
on;
declare
varno
varchar2(20);
varprice
varchar2(20);
CURSOR
mycur(vartype
number)
is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no
=
vartype;
begin
if
mycur%isopen
=
false
then
open
mycur(000627);
end
if;
fetch
mycur
into
varno,varprice;
while
mycur%found
loop
dbms_output.put_line(varno||','||varprice);
if
mycur%rowcount=2
then
exit;
end
if;
fetch
mycur
into
varno,varprice;
end
loop;
close
mycur;
end;
PL/SQL记录的结构和C语言中的结构体类似,是由一组数据项构成的逻辑单元。
PL/SQL记录并不保存在数据库中,它与变量一样,保存在内存空间中,在使用记录时候,要首先定义记录结构,然后声明记录变量。可以把PL/SQL记录看作是一个用户自定义的数据类型。
set
serveroutput
on;
declare
type
person
is
record
(
empno
cus_emp_basic.emp_no%type,
empzc
cus_emp_basic.emp_zc%type);
person1
person;
cursor
mycur(vartype
number)is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no=vartype;
begin
if
mycur%isopen
=
false
then
open
mycur(000627);
end
if;
loop
fetch
mycur
into
person1;
exit
when
mycur%notfound;
dbms_output.put_line('雇员编号:'||person1.empno||',地址:'||person1.empzc);
end
loop;
close
mycur;
end;
典型游标for
循环
游标for循环示显示游标的一种快捷使用方式,它使用for循环依次读取结果集中的行数据,当form循环开始时,游标自动打开(不需要open),每循环一次系统自动读取游标当前行的数据(不需要fetch),当退出for循环时,游标被自动关闭(不需要使用close)。使用游标for循环的时候不能使用open语句,fetch语句和close语句,否则会产生错误。
set
serveroutput
on;
declare
cursor
mycur(vartype
number)is
select
emp_no,emp_zc
from
cus_emp_basic
where
com_no=vartype;
begin
for
person
in
mycur(000627)
loop
dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);
end
loop;
end;
游标能够根据查询条件从数据表中提取一组记录,将其作为一个临时表置于数据缓冲区中,利用指针逐行对记录数据进行操作。
Oracle中的游标分为显示游标和隐式游标 。
在执行SQL语句时,Oracle会自动创建隐式游标,该游标是内存中处理该语句的数据缓冲区,存储了执行SQL语句的结果。通过隐式游标属性可获知SQL语句的执行状态信息。
%found:布尔型属性,如果sql语句至少影响到一行数据,值为true,否则为false。
%notfound:布尔型属性,与%found相反。
%rowcount:数字型属性,返回受sql影响的行数。
%isopen:布尔型属性,当游标已经打开时返回true,游标关闭时则为false。
用户可以显式定义游标。使用显式游标处理数据要4个步骤:定义游标、打开游标、提取游标数据和关闭游标。
游标由游标名称和游标对应的select结果集组成。定义游标应该放在pl/sql程序块的声明部分。
语法格式:cursor 游标名称(参数) is 查询语句
打开游标时,游标会将符合条件的记录送入数据缓冲区,并将指针指向第一条记录。
语法格式:open 游标名称(参数);
将游标中的当前行数据赋给指定的变量或记录变量。
语法格式:fetch 游标名称 into 变量名;
游标一旦使用完毕,就应将其关闭,释放与游标相关联的资源。
语法格式:close 游标名称;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
loop
fetch c1 into v_sno,v_cno,v_grade;
exit when c1%notfound;--紧跟fetch之后
if c1%found then
dbms_output.put_line(to_char(c1%rowcount)||v_cno);
end if;
end loop;
close c1;
end;
declare
cursor c1 is select sno,cno,grade from sc;
v_sno sc.sno%type;
v_cno sc.cno%type;
v_grade sc.grade%type;
begin
open c1;
fetch c1 into v_sno,v_cno,v_grade;
while c1%found loop
dbms_output.put_line(v_sno||v_cno||v_grade);
fetch c1 into v_sno,v_cno,v_grade;
end loop;
close c1;
end;
第三种:for
declare
cursor c1 is select sno,cno,grade from sc;
begin
for item in c1 loop
dbms_output.put_line(rpad(item.sno,'10',' ')||rpad(item.cno,'10',' ')||rpad(item.grade,'10',' '));
end loop;
end;