有朋友问我oracle存储过程怎么写?游标怎么写?游标如何控制批次,分批次提交?
我稍稍回忆了一下,刚好写博客里,有需要的可以参考了解。直接上代码+注释,仅做参考。
朋友他没装plsql develper,我也没有,哈哈,盲敲盲改,最后总算改好了。连接oracle神器,大家经常用的话,自己装一下,可以清晰标黄提示错误信息等,很方便。
-- 建议大家第一次创建sp的时候用create。后面移交部署用创建并且替换,注意不要和之前的名字重复了。
CREATE OR REPLACE PROCEDURE stored_procedure_name(
-- 入参名称,当然也可以根据需要加入in out关键字
in_parameter varchar2
)
is
-- 自定义变量
page_size int;
now timestamp;
plan_id varchar2(50);
-- 自定义游标
type cursors is ref cursor;
cur cursors;
-- 自定义结果集
type COLLECTION_T_XXX is table of table_name%rowtype;
C_T_SRV_PRICE_PLAN COLLECTION_T_XXX;
BEGIN
-- 设置一次fetch多少条数据
page_size:=1000;
-- 打开游标
open cur for SELECT * FROM table_name
WHERE CREATE_TIME <TO_TIMESTAMP('2020-12-12 00:00:00','YYYY-MM-DD HH24:MI:SS') AND ACTIVE ='Y';
-- 开启外层游标cur循环
loop
-- 提前判断游标是否结束
exit when cur%notfound;
-- 批量获取游标里面数据,这里设置一次获取1000条
fetch cur bulk collect into C_T_SRV_PRICE_PLAN limit page_size;
-- 开启内层隐式游标,循环我们拿到的1000条数据
for i in 1..C_T_SRV_PRICE_PLAN.count loop
-- 这里很简单,但很重要。初始化游标里面需要的变量值,避免拿到上一次的赋值。
plan_id := null;
-- 下面是业务逻辑,手动打码,根据自己需要填充。
-- 结束内层隐式游标
end loop;
-- 分批次提交
commit;
-- 结束外层游标循环
end loop;
-- 关闭外层游标
close cur;
-- 结束存储过程
END stored_procedure_name;
-- 标准的完整语句要加/,结束标志。
/