建立测试数据
create table tstudent(
sno varchar2(10) primary key,
sname varchar2(20),
sage number(2),
ssex varchar2(5)
);
insert into tstudent values ('s001','张三',23,'男');
insert into tstudent values ('s002','李四',23,'男');
insert into tstudent values ('s003','王二麻子',25,'男');
insert into tstudent values ('s004','小明',20,'女');
insert into tstudent values ('s005','小红',20,'女');
insert into tstudent values ('s006','小黑',21,'男');
insert into tstudent values ('s007','小黄',21,'男');
insert into tstudent values ('s008','小绿',21,'女');
insert into tstudent values ('s009','小白',23,'女');
insert into tstudent values ('s010','小紫',22,'女');
commit
游标 :游标字面意思是游动的光标 。游标是映射在结果集中一行数据上的位置实体,是从表中检索出结果集,并从中每次指向一条记录进行交互的机制
打印teststudent表的sname和sage
create or replace procedure teststudent is
--声明一个游标 CURSOR 游标名 [ (参数名 数据类型[,参数名 数据类型]...)]
-- IS SELECT 语句;
cursor nameandage is
select sname,sage from tstudent;
sn tstudent.sname%type;
sa tstudent.sage%type;
begin
open nameandage;
loop
fetch nameandage into sn, sa ;
exit when nameandage%notfound;
dbms_output.put_line(sa||'hello'||sn);
end loop;
close nameandage;
end teststudent;
1 Oracle中FETCH和FOR循环
FETCH需要显式声明游标,显式打开、关闭游标。
FOR不需要显式声明游标,是隐式打开、关闭游标
2 ORACLE中%TYPE和%ROWTYPE的使用
1 %TYPE说明
为了使一个变量的数据类型与另一个已经定义了的变量(尤其是表的某一列)的数据类型相一致,Oracle提供了%TYPE定义方式。当被参照的那个变量的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个变量的数据类型时,就只能采用这种方法定义变量的数据类型。
2 %ROWTYPE说明
如果一个表有较多的列,使用%ROWTYPE来定义一个表示表中一行记录的变量,比分别使用%TYPE来定义表示表中各个列的变量要简洁得多,并且不容易遗漏、出错。这样会增加程序的可维护性。
为了使一个变量的数据类型与一个表中记录的各个列的数据类型相对应、一致,Oracle提供%ROWTYPE定义方式。当表的某些列的数据类型改变了之后,这个新定义的变量的数据类型会自动跟随其改变,容易保持一致,也不用修改PL/SQL程序了。当不能确切地知道被参照的那个表的结构及其数据类型时,就只能采用这种方法定义变量的数据类型。
一行记录可以保存从一个表或游标中查询到的整个数据行的各列数据。一行记录的各个列与表中一行的各个列有相同的名称和数据类型。
原文链接:https://blog.csdn.net/liangweiwei130/article/details/38117847
综上述两点
程序也可以这样写
打印teststudent表的sname和sage
create or replace procedure teststudent1 is
cursor nameandage is
select sname,sage from tstudent;
--游标变量
s nameandage%rowtype;
begin
for s in nameandage loop
dbms_output.put_line(s.sage||'hello'||s.sname);
end loop;
end teststudent1;