批量SQL实例分析与比较_第1页
批量SQL实例分析与比较_第2页
批量SQL实例分析与比较_第3页
批量SQL实例分析与比较_第4页
批量SQL实例分析与比较_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、批量 实例分析与比较Oracle在 PL/SQL中引入了BULK ,用于尽量减少 PL/SQLSQL引擎之间的交互,以期提高性能。具体而言,Oracle SQL包括语句、 COLLECT子句。前者将多条语句通常是一次性发送给SQL引擎后者将 SQL引擎所获得的结果一次性返回给PL/SQL引擎。FORALL下面的两个例子对比了 与 FOR循环之间的区别:SQL tablet_bulkasselect* fromemployees; descNameTypeNullableDefault - - - -EMPLOYEE_ID YFIRST_NAME YLAST_NAME VARCHAR2(25)P

2、HONE_NUMBER Y JOB_IDVARCHAR2(10)NUMBER(8,2) YCOMMISSION_PCT N) YMANAGER_ID Y_ID N YDECLARE NIS OF NUMBER; := NumList(10, 30, 70);FOR i INdepts.FIRST.depts.LAST FROM WHERE department_id = depts(END END;NumList VARRAY(20)OFNUMBER; := 30, 70); - d i depts.FIRST.depts.LAST FROM department_id =depts(i);E

3、ND;虽然从内部执行机制上来说,两个循环有很大的区别,但从语法上来说,还是非常类似的。不过有一个小细节需要注意,就是 语句并没有对应的语句。我们再来看看使用 FORALL的情况下对异常的处理:TABLEt_bulk2(f1 NUMBER(3);TYPE type1IS OF NUMBER;v type1:=type1(1, 2, 3000, 4, 5,6, 77777, 8, 9, 10001);EXECUTEIMMETRUNCATETAB t_bulk2;-idx IN v.FIRST.v.LASTINSERT INTOt_bu V- TDBMS_OUTPUT.PUT_LINE(SQLERR

4、M);END;ORA-01438: 值大于为此列指定的允许精度 proceduresuccessfullycompletedSQL * FROMF1-12Oracle9i中引入了 SA EXCEPTIONS“ORA-24381:)in DML”异常,使用它们,我们可以跳过 FORALL中出现异常的语句,并将异常保存在 SQL%BULK_EXCEPTIONSP这个集合中:DECLARE TABLEOF NUMBER;v =type1(1,2, 3000, 4, 5, 6, 77777, 8, 9, 10001);-BULK_ERROREXCEPTION;PRAGMAEXCEPTION_INIT(

5、BULK_ERROR, IMMEDIATETRUNCATE T t_bulk2;- idxIN SAVEEXCEPTIONS INTOt_bulk2 VALUES(v(idx);-EXCEPTION THENFORi IN 1.SQL%BULK_EXCEPTIONS.COUNT LOOPDBMS_OUTPUT.PUT_LINE(SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)|,#|SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);ENDWHEN THORA-01438:值大于为此列指定的允许精度, #3ORA-01438:值大于为此

6、列指定的允许精度, #7ORA-01438:值大于为此列指定的允许精度, #10 proceduresuccessfullycompletedSQL * FROMF1-1245689注意使用 ERROR_CODE时要加上负号。)下面介绍如何获取第一条语句所影响的行数,这需要使用SQL%BULK_ROWCOUNT:create tablenumber);insertintot_bulk3insert t_bulk3values(2);insert t t_bulk3 3); intot_bu vainsertintot_bulk3insert t_bulk3values(3);type1IS T

7、ABLEOF vtype1:=type1(1,2, 3, - EXCEPTION; EXCEPTION_INIT(BULK_ERROR, -24381);idx IN v.FIRST.v.LASTSAVE EFROM -FORidxIN LOOPDBMS_OUTPUT.PUT_LINE(Statement: #|SQL%BULK_ROWCOUNT(idx)| LOOP;- BULK_ERRORFOR i IN1.SQL%BULK_EXCEPTIONS.COUNT DBMS_OUTPUT.PUT_LINE(SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE)|,

8、 #|SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);END WH OTHERSTHEN #1, 1 rowswere 2 rows impacted.Statement:#3, 4 rows wereimpacted.Statement:#4, 0 ro imPL/SQLproceduresuccessfully coBULK 假设有一条 查询,返回的记录中包含 5行,那么如果在中执行此查询,会有 5次的PL/SQLSQL交互,如果使用BULK ,可以降低到1次。BULK 子句可以出现在以下语句中:SELECTINTOFETCH INTOcreatetab t_bul

9、k4(fidnumber,fvalvarchar2(20); t_bulk4 values(1,abc);insertintot_bulk4insert t val,xyz); intot_bu vaxx);insert t_bulk4values(5,123);TYPE type1IS OF t_bulk4%ROWTYPE;v ;SELECT* BULKCOLLECTINTO v t_bulk4;-FORi IN 1.v.COUNT D ENDEND;1 abc2 def3 xyz4 xxx5 123 proceduresuccessfullycompleted另一个 BY集合的示例实际上使

10、用跟上例一样的FOR循环也可以:type1IS TABLEOF INDEXBY vtype1;idxPLS_INTEGER;SELECT* COLLECT v FROMt_bulk4;-IS NOT DBMS_OUTPUT.PUT_LINE(v(idx).fid| |v(idx).fval); :=END LOOP;END;FETCH BU CO INTO的使用与上述例子都类似,不多写了。关于 RETURNING + COLLECT,我们来一个综合的例子:create tablenumber);DECLARE IS OFv e1(1,2, 3,5);- IS OF t_bulk5.fid%TYPE;v2 FORALL idx INSERT t_bulk5 RE BULKCOLLECT -DBMS_OUTPUT.PUT_LINE(v2.COUNT);4PL/SQLproceduresuccessfully completed顺便比较一下使用 FOR循环时是什么结果:DECLARE IS OFv e1(1,2, 3,5);- IS OF t_bulk5.fid%TYPE;v2 FORidxIN v.FIRST.v.LAST LOOPINTO VALUES(v(idx) RETURNING CINTOv2;LOOP;-DBMS_OUTPU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论