存储过程中使用游标带参数的目的是什么,为什么不能将参数直接放在procedure里面呢,感觉怪怪的

 我来答
匿名用户
2013-01-15
展开全部
snowy_howe 回答是正确的.

下面我粘贴一下 使用 使用游标带参数的例子, 与 不使用的例子, 你可以对照一下.

-- 首先是一个 使用 带参数的游标的例子, 也就是那个 游标(子表).

DECLARE
-- 定义游标(主表).
CURSOR c_test_main IS
SELECT id, value FROM test_main;
-- 保存主表游标数据的变量
v_main_data c_test_main%ROWTYPE;

-- 定义游标(子表).
CURSOR c_test_sub(p_main_id INT) IS
SELECT id, value
FROM test_sub
WHERE main_id = p_main_id;
-- 保存子表游标数据的变量
v_sub_data c_test_sub%ROWTYPE;
BEGIN

-- 打开游标(主表).
OPEN c_test_main;
-- 开始循环处理(主表).
LOOP
-- 填充数据(主表).
FETCH c_test_main INTO v_main_data;
-- 假如没有检索到(主表)数据,结束循环处理
Exit when c_test_main%NOTFOUND;

dbms_output.put_line('Main:'
|| TO_CHAR(v_main_data.id) || '='
|| v_main_data.value );

-- 打开游标(子表).
OPEN c_test_sub(v_main_data.id);
-- 开始循环处理(子表).
LOOP
-- 填充数据(子表).
FETCH c_test_sub INTO v_sub_data;
-- 假如没有检索到(子表)数据,结束循环处理
Exit when c_test_sub%NOTFOUND;

dbms_output.put_line('-->Sub:'
|| TO_CHAR(v_sub_data.id) || '='
|| v_sub_data.value );
END LOOP;
-- 关闭游标(子表).
CLOSE c_test_sub;
END LOOP;
-- 关闭游标(主表).
CLOSE c_test_main;
END;
/

-- 下面是 SQL Server 的, 不支持 带参数的游标 的

子游标的中的 SQL 语句里面,写入子表列名 = @变量的方式。
通过在父游标中更新该变量的方式来实现同样的功能。

DECLARE
@id INT, @value VARCHAR(10),
@subid INT, @subvalue VARCHAR(10);
BEGIN
-- 定义游标(主表).
DECLARE c_test_main CURSORFOR
SELECT id,valueFROM test_main;
-- 注意:假如子表的游标定义在这里,执行的时候,将得不到结果
-- 打开游标(主表).
OPEN c_test_main;

WHILE 1=1
BEGIN
-- 填充数据.
FETCH NEXT FROM c_test_main INTO @id, @value;
-- 假如未检索到(主表)数据,退出循环.
IF@@fetch_status!= 0 BREAK;

PRINT'Main:'+CAST(@id asvarchar)+'='+ @value;

-- 定义游标(子表).
DECLARE c_test_sub CURSORFOR
SELECT id,value
FROM test_sub
WHERE main_id = @id;

-- 打开游标(子表).
OPEN c_test_sub;

WHILE 2=2
BEGIN
-- 填充数据.
FETCH NEXT FROM c_test_sub INTO @subid, @subvalue;
-- 假如未检索到(子表)数据,退出循环.
IF@@fetch_status!= 0 BREAK;

PRINT'Sub:'+ @subvalue;
END;

-- 关闭游标(子表)
CLOSE c_test_sub;

-- 释放游标(子表).
DEALLOCATE c_test_sub;
END;

-- 关闭游标(主表)
CLOSE c_test_main;
-- 释放游标(主表).
DEALLOCATE c_test_main;
END;
go
百度网友183c468
2013-01-15 · TA获得超过209个赞
知道小有建树答主
回答量:267
采纳率:0%
帮助的人:127万
展开全部
两个游标嵌套时,第二个游标要用到上一个游标的列信息。
cursor a is select col1 from test1;
cursor b(param1) is select col2 from test2 where col2 = param1;
.......
open b(a.col1);
......
这种情况。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式