背景:要往一个大表里面插入或者修改数据,这个表已经有几百万条数据了,想到了批量绑定,想到了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`语句作为Oracle PL/SQL的一个强大特性,提供了批量绑定和批量收集的能力,能够显著提升处理大量数据时的效率。本文将深入探讨`FORALL`的使用方法及其背后的原理,帮助开发者更好地理解和应用这一功能...
`FORALL` 是 Oracle PL/SQL 中的一个强大特性,主要用于批量处理数据,如批量插入、更新或删除等操作。使用 `FORALL` 可以显著提升数据库应用程序的性能,尤其是在处理大量数据时。 #### 二、FORALL 语法及特点 `...
3. **FORALL**:在收集了大量数据后,可以使用FORALL语句一次性将它们插入到数据库中,避免了循环中的单次插入,提高了性能。 4. **绑定变量**:在Oracle中,绑定变量可以用来提高查询性能,减少解析次数。在批量...
它在发送SQL语句到SQL引擎之前,先将输入集合批量绑定。 2. **批绑定提高性能**: 批绑定通过一次性处理多个数据项,显著减少了PL/SQL与SQL引擎之间的通信次数。这包括三种类型的绑定操作: - in-bind(输入绑定...
输入绑定则使用`FORALL`关键字,它指示PL/SQL引擎在发送SQL语句给SQL引擎执行前先进行批量绑定。这样,对于一组操作,只需要一次上下文切换,提高了执行速度。例如: ```sql FORALL i IN index_range INSERT INTO ...
4. **事件绑定**:为了响应用户的操作,我们需要将`selectAll`和`unselectAll`函数绑定到全选和反选的复选框上,通常使用`addEventListener`方法。 ```javascript var allCheckbox = document.getElementById('...
1. 首先,我们需要一个复选框作为全选控制项,它的`id`可以设置为`selectAll`,并绑定一个`click`事件监听器。 ```html <input type="checkbox" id="selectAll"> 全选 ``` 2. 在JavaScript中,我们可以通过`...
适配器通常是实现了`BaseAdapter`或`ArrayAdapter`的类,它负责将数据模型与视图进行绑定。在适配器的`getView()`方法中,我们需要为每个ListView项添加一个CheckBox,并将其状态与数据模型中的某个字段关联起来。 ...
`FORALL`与`BULK COLLECT`是PL/SQL中的两个关键字,它们一起用于在存储过程或函数中执行批量DML操作,如INSERT、UPDATE或DELETE。这种方式可以减少网络往返次数,大大提高执行效率。 2. **存储过程(Stored ...
#### 五、批量绑定与FORALL语句 批量绑定是指在一个操作中同时处理多条记录的技术。通过使用`FORALL`语句,可以在一次操作中插入、更新或删除多个记录。 示例代码: ```plsql DECLARE TYPE rec_type IS RECORD ...
3. **使用PL/SQL块的FORALL语句**:当需要更新的数据量非常大时,PL/SQL的FORALL语句能显著提高性能。它允许一次性提交多行更新,减少网络通信和数据库调用: ```sql DECLARE TYPE num_tab_type IS TABLE OF ka02...
5. **利用FORALL支持进行批量绑定** - FORALL语句允许一次性处理多个记录,进一步减少了网络传输开销。 6. **使用SAVE EXCEPTIONS语法处理异常** - 此语法使得异常处理更为高效,特别是在处理批量操作时。 7. **...
- **数据绑定**:在Vue组件中,通过`data`函数返回的数据对象可以动态绑定到界面上,比如`v-model`用于双向绑定表单输入,`v-for`用于渲染列表。 - **事件处理**:通过监听`@selection-change`事件,可以获取到用户...
PL/SQL支持批量处理,通过诸如游标FOR循环和FORALL语句等机制,可以高效地处理大量数据。 **5、可移植性** PL/SQL代码可以在任何安装了Oracle数据库的平台上运行,具有良好的可移植性。 **6、与SQL紧密结合** PL...
1.在过去一年,小编写过一个批量上传图片的例子,那个例子是基于百度编辑器改造的,用起来必须依赖百度编辑器,所以小编就又弄了一个,就是今天要介绍的了,uploadify上传的了前端用flash,javascript编写,后端兼容...
#### 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 ...
如果你在Windows环境下,`win32print`是Python的Windows API接口,可以轻松地与本地打印机进行交互。如果没有安装,可以通过pip进行安装: ```bash pip install pypiwin32 ``` 批量打印文件的基本步骤包括以下几个...
- **批量绑定变量(FORALL)**:FORALL结构允许在循环中批量执行DML操作,如`FORALL i IN 1..x.COUNT INSERT INTO t VALUES (x(i))`,其中`x`是一个集合。 以上知识点涵盖了Oracle SQL中并行查询、数据操作、集合...
在实际应用中,为了进一步提高性能,可以结合Oracle的`BULK COLLECT`和`FORALL`语句,以及使用绑定变量来处理大量数据。此外,对于超大规模的数据导入,可以考虑使用`SQL*Loader`工具,它能快速高效地从外部文件导入...
FORALL是PL/SQL中的一个迭代控制结构,它允许一次性处理数组中的多个元素,从而提高批量处理的效率。相比传统的循环,FORALL可以减少调用过程的开销,尤其在插入、更新和删除大量记录时,性能提升显著。 4. **BULK...