`
cy729215495
  • 浏览: 129275 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

forall与批量绑定

阅读更多

  背景:要往一个大表里面插入或者修改数据,这个表已经有几百万条数据了,想到了批量绑定,想到了forall。

 

在做此之前先写个测试的例子:

 

---这个例子的目的就是将e2表中的数据插入追加到e1里面去,
---如果e1表里面存在,就修改之。不存在,就添加。
--我还是用id来判断是否存在
create or replace procedure 
e_insert
as
----定义三个集合变量类型,oracle官方说法是nested table。

 TYPE type_no IS TABLE OF e2.e1no%type
         INDEX BY BINARY_INTEGER;        
  TYPE type_name IS TABLE OF e2.enname%type
         INDEX BY BINARY_INTEGER;
     TYPE type_e2 IS TABLE OF e2%rowtype
         INDEX BY BINARY_INTEGER;               
         insert_e2 type_e2;
update_name  type_name;
update_no  type_no;
begin
---查找e1表中不存在而e2表中存在的数据,这部分数据是要
---添加到e1表里面去的。这里用批量绑定,将查询到的数据
--赋给相应集合变量,注意变量类型一定要匹配。

  select e2.enname,e2.e1no bulk collect  into 
  update_name,update_no from e2 left join
e1 on e1.e1no=e2.e1no where e1.e1no is not null;

---查找e1表中不存在而e2表中存在的数据,这部分数据是要
---添加到e1表里面去的
select e2.* bulk collect  into 
insert_e2 from e2 left join
e1 on e1.e1no=e2.e1no where e1.e1no is null;


dbms_output.put_line('----'||insert_e2.count);---查询集合里面的个数

dbms_output.put_line('-------'||update_name.count||'  '||update_no.count);


if insert_e2.count>0 then 
forall j in insert_e2.FIRST..insert_e2.LAST  
insert into e1
values insert_e2(j);---注意这里values后面没有括号

elsif update_no.count>0  then---注意这里的elsif 
forall i in update_no.FIRST..update_no.LAST  
update e1 set e1.enname=update_name(i) where e1.e1no=update_no(i);   

end if;



commit;
end e_insert;

 

 

e1表的字段很随便,e2是e1的副本,用create table e2 as select * from e1 where rownum<500

创建的。

 

这里很多要值得注意的地方:

1.存储过程要是没有参数,过程名称后面是没有括号的。

2.forall 和for语法基本相同,但是没有loop   end loop.

  forall后面只能跟DML语句,动态sql也可以。

3.把批量绑定想象成sql 引擎到plsql 引擎的批处理。

  把forall 想象成plsql到sql引擎的批处理。

sql引擎专门处理sql语句呀,plsql引擎处理plsql程序块。

这样减少了上下文切换的时间,加快了sql的运行。

其实这很像java里面的executeBatch。

 

4.还有一点,也是非常重要的一点,forall 后面的DML语句里面不能有集合变量的元素的字段。

insert into e1
values insert_e2(j);
这里的insert_e2(j)就是集合元素,e1no是它的字段。

出现insert_e2(j).e1no是不行滴,是要报错误滴。

尽管它是行集变量类型。

这里我用列类型解决了这个问题。

 

ok。完了。

 

 

 

 

 

 

分享到:
评论

相关推荐

    forall 用法小结

    其中,`FORALL`语句作为Oracle PL/SQL的一个强大特性,提供了批量绑定和批量收集的能力,能够显著提升处理大量数据时的效率。本文将深入探讨`FORALL`的使用方法及其背后的原理,帮助开发者更好地理解和应用这一功能...

    for all 用法小结

    `FORALL` 是 Oracle PL/SQL 中的一个强大特性,主要用于批量处理数据,如批量插入、更新或删除等操作。使用 `FORALL` 可以显著提升数据库应用程序的性能,尤其是在处理大量数据时。 #### 二、FORALL 语法及特点 `...

    批量插入数据到Oracle数据库Demo

    3. **FORALL**:在收集了大量数据后,可以使用FORALL语句一次性将它们插入到数据库中,避免了循环中的单次插入,提高了性能。 4. **绑定变量**:在Oracle中,绑定变量可以用来提高查询性能,减少解析次数。在批量...

    JAVA 与 Sql学习笔记

    它在发送SQL语句到SQL引擎之前,先将输入集合批量绑定。 2. **批绑定提高性能**: 批绑定通过一次性处理多个数据项,显著减少了PL/SQL与SQL引擎之间的通信次数。这包括三种类型的绑定操作: - in-bind(输入绑定...

    Oracle Bulk Binds技术分析.pdf

    输入绑定则使用`FORALL`关键字,它指示PL/SQL引擎在发送SQL语句给SQL引擎执行前先进行批量绑定。这样,对于一组操作,只需要一次上下文切换,提高了执行速度。例如: ```sql FORALL i IN index_range INSERT INTO ...

    checkbox全选反选与批量删除附源码

    4. **事件绑定**:为了响应用户的操作,我们需要将`selectAll`和`unselectAll`函数绑定到全选和反选的复选框上,通常使用`addEventListener`方法。 ```javascript var allCheckbox = document.getElementById('...

    JavaScript实现的全选效果与批量删除效果

    1. 首先,我们需要一个复选框作为全选控制项,它的`id`可以设置为`selectAll`,并绑定一个`click`事件监听器。 ```html &lt;input type="checkbox" id="selectAll"&gt; 全选 ``` 2. 在JavaScript中,我们可以通过`...

    Android ListView支持批量选择

    适配器通常是实现了`BaseAdapter`或`ArrayAdapter`的类,它负责将数据模型与视图进行绑定。在适配器的`getView()`方法中,我们需要为每个ListView项添加一个CheckBox,并将其状态与数据模型中的某个字段关联起来。 ...

    oracle性能

    `FORALL`与`BULK COLLECT`是PL/SQL中的两个关键字,它们一起用于在存储过程或函数中执行批量DML操作,如INSERT、UPDATE或DELETE。这种方式可以减少网络往返次数,大大提高执行效率。 2. **存储过程(Stored ...

    plsql编程与优化

    #### 五、批量绑定与FORALL语句 批量绑定是指在一个操作中同时处理多条记录的技术。通过使用`FORALL`语句,可以在一次操作中插入、更新或删除多个记录。 示例代码: ```plsql DECLARE TYPE rec_type IS RECORD ...

    解决Oracle批量修改问题

    3. **使用PL/SQL块的FORALL语句**:当需要更新的数据量非常大时,PL/SQL的FORALL语句能显著提高性能。它允许一次性提交多行更新,减少网络通信和数据库调用: ```sql DECLARE TYPE num_tab_type IS TABLE OF ka02...

    oracle 文档

    5. **利用FORALL支持进行批量绑定** - FORALL语句允许一次性处理多个记录,进一步减少了网络传输开销。 6. **使用SAVE EXCEPTIONS语法处理异常** - 此语法使得异常处理更为高效,特别是在处理批量操作时。 7. **...

    vue+element+Java实现批量删除功能

    - **数据绑定**:在Vue组件中,通过`data`函数返回的数据对象可以动态绑定到界面上,比如`v-model`用于双向绑定表单输入,`v-for`用于渲染列表。 - **事件处理**:通过监听`@selection-change`事件,可以获取到用户...

    PL-SQL用户指南与参考(译)

    PL/SQL支持批量处理,通过诸如游标FOR循环和FORALL语句等机制,可以高效地处理大量数据。 **5、可移植性** PL/SQL代码可以在任何安装了Oracle数据库的平台上运行,具有良好的可移植性。 **6、与SQL紧密结合** PL...

    批量上传图片jsp,c#,php版本

    1.在过去一年,小编写过一个批量上传图片的例子,那个例子是基于百度编辑器改造的,用起来必须依赖百度编辑器,所以小编就又弄了一个,就是今天要介绍的了,uploadify上传的了前端用flash,javascript编写,后端兼容...

    PLSQL笔记(EFRIOO&GUOH)1.doc

    #### 7.13.5 在 FORALL 语句上使用 INDICES OF 子句 ```sql FORALL i IN INDICES OF v_employees INSERT INTO employees (employee_id) VALUES (v_employees(i)); ``` #### 7.13.6 在 FORALL 语句上使用 VALUES ...

    Python指挥打印机批量打印文件.rar

    如果你在Windows环境下,`win32print`是Python的Windows API接口,可以轻松地与本地打印机进行交互。如果没有安装,可以通过pip进行安装: ```bash pip install pypiwin32 ``` 批量打印文件的基本步骤包括以下几个...

    Oracle_SQL学习笔记

    - **批量绑定变量(FORALL)**:FORALL结构允许在循环中批量执行DML操作,如`FORALL i IN 1..x.COUNT INSERT INTO t VALUES (x(i))`,其中`x`是一个集合。 以上知识点涵盖了Oracle SQL中并行查询、数据操作、集合...

    Oracle批量插入数据的三种方式【推荐】

    在实际应用中,为了进一步提高性能,可以结合Oracle的`BULK COLLECT`和`FORALL`语句,以及使用绑定变量来处理大量数据。此外,对于超大规模的数据导入,可以考虑使用`SQL*Loader`工具,它能快速高效地从外部文件导入...

    oracle 优化笔记

    FORALL是PL/SQL中的一个迭代控制结构,它允许一次性处理数组中的多个元素,从而提高批量处理的效率。相比传统的循环,FORALL可以减少调用过程的开销,尤其在插入、更新和删除大量记录时,性能提升显著。 4. **BULK...

Global site tag (gtag.js) - Google Analytics