存储过程中使用游标带参数的目的是什么,为什么不能将参数直接放在procedure里面呢,感觉怪怪的
2个回答
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
下面我粘贴一下 使用 使用游标带参数的例子, 与 不使用的例子, 你可以对照一下.
-- 首先是一个 使用 带参数的游标的例子, 也就是那个 游标(子表).
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询