使用cursor的疑问

[复制链接]
查看11 | 回复9 | 2011-11-1 16:26:29 | 显示全部楼层 |阅读模式
本帖最后由 goberl 于 2012-3-8 08:49 编辑
请问下面两种方法有什么区别,谢谢!!
--方法1
cursor c_student is select age from student
open c_2;
loop
Fetch c_student into v_age;
--more todo
end loop;
close c_2复制代码--方法2
for item (select agefrom student) loop
v_age:=item.age;
--more todo
end loop;复制代码平时为了方便都是用的方法2,不知道有什么弊端没有!!

回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
CREATE OR REPLACE PROCEDURE t_pro_rc_change
AS
TYPE cs IS REF CURSOR;
TYPE v_list IS TABLE OF VARCHAR2(200);
cs_sql VARCHAR2(1000);
c_studentcs;
v_age v_list;
BEGIN
cs_sql := 'select agefrom student';
OPENc_studentFOR cs_sql;
FETCHc_studentBULK COLLECT INTO v_age;
CLOSE rc;
FOR i IN v_age.FIRST .. v_age.LAST
LOOP
...
END LOOP;
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
风铃中の鬼 发表于 2012-3-8 09:14
CREATE OR REPLACE PROCEDURE t_pro_rc_change
AS

意思是一样的?一个是显示一个是隐式?
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
goberl 发表于 2012-3-8 11:05
意思是一样的?一个是显示一个是隐式?

我觉得你那2个是一样的。。。但是用我下面给出来的那种就不一样了。。那个更快
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
风铃中の鬼 发表于 2012-3-8 11:30
我觉得你那2个是一样的。。。但是用我下面给出来的那种就不一样了。。那个更快

哦,有相关文档么?
谢谢了!!!
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
goberl 发表于 2012-3-8 11:38
哦,有相关文档么?
谢谢了!!!

直接在论坛里搜索吧,PL/SQL,存储过程什么的关键字
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
试一下签名
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
风铃中の鬼 发表于 2012-3-8 11:30
我觉得你那2个是一样的。。。但是用我下面给出来的那种就不一样了。。那个更快

现在有个系统,里面的存储过程都用的方法一。数据库三五天就报Current Open Cursors Count
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
使用BULK COLLECT 语句将加快效率
回复

使用道具 举报

千问 | 2011-11-1 16:26:29 | 显示全部楼层
goberl 发表于 2012-3-8 15:11
现在有个系统,里面的存储过程都用的方法一。数据库三五天就报Current Open Cursors Count

你的第一个还少点东西:
OPEN rc;
LOOP
FETCH rc
INTO xxx;
EXIT WHEN rc%notfound;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行