注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

有你做翅膀,孤单都是坚强

生命中总要经历曲折,或许是我们不愿意,突然到最后走不通,想重新来过,记录每件小事

 
 
 

日志

 
 
关于我
K24

曾经的生涩,曾经的懵懂,曾经的自恋,都随风去吧。。。

网易考拉推荐
 
 

oracle真正的批量提交  

2016-08-17 09:42:32|  分类: @sql |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

以下代码针对oracle10

CREATE OR REPLACE PROCEDURE P_FETCH_SERV_RECORD IS

TEMP_BUSINESS_TYPE VARCHAR2(10) := 'DATA'; --业务类型
TEMP_BILLING_CYCLE_ID VARCHAR2(10) := '11608';

TEMP_TABLE_NAME VARCHAR2(100);
TEMP_SQL VARCHAR2(1000);
TEMP_RECORD_CNT NUMBER(10);

--定义游标
TEMP_CURSOR SYS_REFCURSOR;

CURSOR C_ORG_CODE IS
SELECT REGION_ID
FROM BILL.BU_REGION_INFO
WHERE 1 = 1
--AND REGION_ID = '370'
ORDER BY REGION_ID ASC;

--自定义类型
TYPE ROW_TABLE IS TABLE OF your_table%ROWTYPE INDEX BY PLS_INTEGER;

MYROW ROW_TABLE;

BEGIN

FOR TEMP_ROW IN C_ORG_CODE LOOP

--临时表名
TEMP_TABLE_NAME := 'BILL.MOBILE_' || TEMP_BUSINESS_TYPE || '_EVENT_0' ||
TEMP_ROW.REGION_ID || '_' || TEMP_BILLING_CYCLE_ID;

DBMS_OUTPUT.PUT_LINE('cur region: ' || TEMP_ROW.REGION_ID || '------' ||
TO_CHAR(SYSDATE, 'yyyymmddhh24miss'));

TEMP_SQL := 'your sql here..';

DBMS_OUTPUT.PUT_LINE('cur sql: ' || TEMP_SQL || '------' ||
TO_CHAR(SYSDATE, 'yyyymmddhh24miss'));

OPEN TEMP_CURSOR FOR TEMP_SQL;

WHILE (TRUE) LOOP

FETCH TEMP_CURSOR BULK COLLECT
INTO MYROW LIMIT 1000;

EXIT WHEN MYROW.COUNT = 0;

--注意这里没有用EXIT WHEN TEMP_CURSOR%NOTFOUND;

--注意这里没有用EXIT WHEN TEMP_CURSOR%NOTFOUND;

--注意这里没有用EXIT WHEN TEMP_CURSOR%NOTFOUND;


FOR INX IN MYROW.FIRST .. MYROW.LAST LOOP

INSERT INTO B1_LSL_TEMP
(COL1, COL2)
VALUES
('巴西话单', MYROW(INX).SERV_ID);
COMMIT;

END LOOP;
--EXIT WHEN TEMP_CURSOR%NOTFOUND;
END LOOP;
CLOSE TEMP_CURSOR;
END LOOP;
DBMS_OUTPUT.PUT_LINE('详单提取正常结束');
--P_INSERT_SMS_INFO('1810383', 'JF', '巴西国漫话单提取正常!');

EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('详单提取异常');
P_INSERT_SMS_INFO('1810383',
'JF',
'巴西国漫话单提取异常!' || SQLCODE);

DBMS_OUTPUT.PUT_LINE(SQLCODE || '---' || SQLERRM || '--------' ||
TEMP_TABLE_NAME || '-----------' || TEMP_SQL);

END P_FETCH_SERV_RECORD;


以下代码针对oracle11

OPEN TEMP_CURSOR FOR TEMP_SQL;

WHILE (TRUE) LOOP

FETCH TEMP_CURSOR BULK COLLECT
INTO MYROW LIMIT 1000;

--EXIT WHEN TEMP_CURSOR%NOTFOUND;

FORALL INX IN MYROW.FIRST .. MYROW.LAST
--FOR INX IN MYROW.FIRST .. MYROW.LAST LOOP

INSERT INTO AI_LISONGLIN.B1_LSL_TEMP
(COL1, COL2)
VALUES
(TEMP_ROW.OFFER_ID, MYROW(INX).INSTANCE_ID);

COMMIT;
EXIT WHEN TEMP_CURSOR%NOTFOUND;

END LOOP;
--END LOOP; --forall时不加loop
CLOSE TEMP_CURSOR;
END LOOP;
              


--------------------------------------------------------------------------------------------------------------------------------------
Q1:为什么使用EXIT WHEN MYROW.COUNT = 0;
A1:如果去除外层的循环直接不带 limit 参数用
fetch all_contacts_cur bulk collect into v_id,v_phone,v_remark
是能够遍历到所有的记录。
而带了 limit 20 参数,因为返回的记录数是 50,执行了两次 fetch bulk 后,还剩下 10 条记录,不足 20 时,第三次 fetch bulk 根本就不取记录,所以程序只会打印出 40 行的 here.

A2:oracle11取消了forall后不能接%rowtype的限制
A3:forall后面不跟loop,也不带end loop,一次性取完全部数据。

  评论这张
 
阅读(12)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017