存储过程之游标

建立测试数据


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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值