- 浏览: 336544 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
hufangxian:
估计面试官都被你的回答搞晕了。
抽象类和接口的理解 -
alvin198761:
需要了解多态和设计模式,了解一些框架的原理,你就知道这东东真正 ...
抽象类和接口的理解 -
sangei:
谢谢楼上提醒,希望慢慢能有所进步。
抽象类和接口的理解 -
jackra:
书背的不错可以看看设计模式如何使用抽象类
抽象类和接口的理解 -
ptsd:
lag(column_x,number1,XX)用来返回当前数 ...
【转】oracle的LAG和LEAD分析函数
SQL> set serveroutput on SQL> declare 2 type tnt_ic01 is table of ic01%rowtype; 3 nt_ic01 tnt_ic01 := tnt_ic01(); 4 n_startTime number; 5 begin 6 n_startTime := dbms_utility.get_time; 7 for rec_ic01 in( select * from ic01 where rownum < 100000 ) loop 8 nt_ic01.extend; 9 nt_ic01( nt_ic01.last ) := rec_ic01; 10 end loop; 11 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 12 dbms_output.put_line( 'USED TIEM: ' || ( dbms_utility.get_time - n_startTime ) ); 13 end; 14 / COUNT: 99999 USED TIEM: 255
PL/SQL 过程已成功完成。 |
SQL> declare 2 type tnt_ic01 is table of ic01%rowtype; 3 nt_ic01 tnt_ic01; 4 n_startTime number; 5 begin 6 n_startTime := dbms_utility.get_time; 7 select * 8 bulk collect into nt_ic01 9 from ic01 10 where rownum < 100000; 11 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 12 dbms_output.put_line( 'USED TIEM: ' || ( dbms_utility.get_time - n_startTime ) ); 13 end; 14 / COUNT: 99999 USED TIEM: 159
PL/SQL 过程已成功完成。 |
SQL> declare 2 type tnt_ic01 is table of ic01%rowtype; 3 nt_ic01 tnt_ic01; 4 rec_ic01 ic01%rowtype; 5 begin 6 --1. normal select, can cause no_data_found 7 begin 8 select * 9 into rec_ic01 10 from ic01 11 where 1 = 0; 12 exception 13 when no_data_found then 14 dbms_output.put_line( 'error1: no_data_found exception accured!' ); 15 end; 16 17 --2. bulk collect, won't cause no_data_found 18 select * 19 bulk collect into nt_ic01 20 from ic01 21 where 1 = 0; 22 if nt_ic01.count = 0 then 23 dbms_output.put_line( 'error2: There is no data in nt_ic01.' ); 24 end if; 25 end; 26 / error1: no_data_found exception accured! error2: There is no data in nt_ic01.
PL/SQL 过程已成功完成。 |
-- 1. fetch collect into SQL> declare 2 cursor cur_ic01 is 3 select * 4 from ic01 5 where rownum < 10; 6 7 type tnt_ic01 is table of cur_ic01%rowtype; 8 nt_ic01 tnt_ic01; 9 begin 10 open cur_ic01; 11 fetch cur_ic01 bulk collect into nt_ic01; 12 close cur_ic01; 13 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 14 end; 15 / COUNT: 9
PL/SQL 过程已成功完成。
-- 2. returning into SQL> select * from test_return;
AAC001 AAC003
SQL> declare
PL/SQL 过程已成功完成。
SQL> select * from test_return; AAC001 AAC003 SQL> |
SQL> declare 2 cursor cur_ic01 is 3 select * 4 from ic01 5 where rownum < 10; 6 7 type tnt_ic01 is table of cur_ic01%rowtype index by pls_integer; 8 nt_ic01 tnt_ic01; 9 begin 10 open cur_ic01; 11 fetch cur_ic01 bulk collect into nt_ic01; 12 close cur_ic01; 13 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 14 end; 15 / COUNT: 9
PL/SQL 过程已成功完成。 |
BULK COLLECT 生成的集合,下表是默认从1开始的数字,步进为1,所以联合数组的索引,不能使用 varchar2 类型。如果你不小心使用了 varchar2 类型作为联合数组的索引,就会出现下面的错误:
SQL> select * from v$version; BANNER SQL> declare 2 type tnt_ic01 is table of ic01%rowtype; 3 nt_ic01 tnt_ic01; 4 5 v_sql_cursor varchar2(1000); 6 begin 7 v_sql_cursor := 'select * from ic01 where rownum < 100000'; 8 execute immediate v_sql_cursor bulk collect into nt_ic01; 9 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 10 end; 11 / COUNT: 99999
PL/SQL 过程已成功完成。
SQL> |
ERROR 位于第 11 行: ORA-06550: 第 11 行, 第 36 列: PLS-00657: 实施约束: 不支持带有 VARCHAR2 关键字的关联性数组的批 SQL。 |
5. VARRAY 数组中使用 BULK COLLECT
而对于 VARRAY 数组,BULK COLLECT 也适用,不过定义时,其长度必须得大于或等于结果集的长度:
SQL> declare 2 cursor cur_ic01 is 3 select * 4 from ic01 5 where rownum < 10; 6 7 type tnt_ic01 is varray(9) of ic01%rowtype; 8 nt_ic01 tnt_ic01; 9 begin 10 open cur_ic01; 11 fetch cur_ic01 bulk collect into nt_ic01; 12 close cur_ic01; 13 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 14 end; 15 / COUNT: 9 PL/SQL 过程已成功完成。 如果 VARRAY 数组长度定义得过小,则会提示错误: SQL> declare 2 cursor cur_ic01 is 3 select * 4 from ic01 5 where rownum < 10; 6 7 type tnt_ic01 is varray(8) of ic01%rowtype; 8 nt_ic01 tnt_ic01; 9 begin 10 open cur_ic01; 11 fetch cur_ic01 bulk collect into nt_ic01; 12 close cur_ic01; 13 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 14 end; 15 / declare * ERROR 位于第 1 行: ORA-22165: 指定的索引 [9] 必须介于 [1] 到 [8] 之间 ORA-06512: 在 line 11 如果 VARRAY 数组长度定义得过大,没什么影响,而且也不会占用多余的内存空间: SQL> declare 2 cursor cur_ic01 is 3 select * 4 from ic01 5 where rownum < 10; 6 7 type tnt_ic01 is varray(10) of ic01%rowtype; 8 nt_ic01 tnt_ic01; 9 begin 10 open cur_ic01; 11 fetch cur_ic01 bulk collect into nt_ic01; 12 close cur_ic01; 13 dbms_output.put_line( 'COUNT: ' || nt_ic01.count ); 14 dbms_output.put_line( 'LIMIT: ' || nt_ic01.limit ); 15 end; 16 / COUNT: 9 LIMIT: 10 PL/SQL 过程已成功完成。 不过推荐首选联合数组,或是嵌套表,在这里虽然可以使用 VARRAY 数组,但显然是不太合适的,就像steven 所介绍的那样。 6. 动态 SQL 中使用 BULK COLLECT
发表评论
-
SQL中on条件与where条件的区别
2016-02-17 10:26 734/* 标题:SQL中 -
mysql update注意
2016-01-18 16:16 605drop table a; CREATE TABLE IF ... -
Oracle中JOB的创建方法以及一个细节的探究(转)
2012-10-15 16:35 1266在Oracle中可以使用JOB来实现一些任务的自动化执行,类似 ... -
oracle里的job和schedule有什么区别(转)
2012-10-15 16:31 1301210g 中新推出的SCHEDULER可能确实会让很多初接触的朋 ... -
procedure的加密
2012-08-06 14:34 774wrap iname=eptapi.pac oname=ept ... -
sql plus中执行pl/sql
2012-03-23 00:18 0declare v_string varc ... -
(转)oracle 带输出参数存储过程
2012-03-23 00:13 0执行带输出参数的存储过程 SQL> var c v ... -
(转)Oracle:Authid Current_User的使用
2012-03-22 23:53 0我们知道,用户拥有的role权限在存储过程是不可用的。遇 ... -
在pl/sql里select dba_jobs为什么不成功
2012-03-22 23:52 0PROCEDURE TEST1 ( PROCEDR ... -
(转)Oracle 中的exception——(Raise)
2012-03-22 23:30 15611.GOTO,主要用于跳转,但会打乱我们的程序逻辑,一般不使用 ... -
(转)PL/SQL --> 动态SQL的常见错误
2012-03-22 18:31 1456--============================ ... -
Oracle SELECT with an array using an IN
2012-01-18 17:03 1335Oracle SELECT with an ... -
pl/sql 实现类似于split 的分割字符串的功能
2012-01-12 23:55 61571、先建立一个包,定义数组类型:CREATE OR REP ... -
c#向pl/sql传递数组参数
2012-01-12 23:48 39211.OracleParameterpout1=OracleDb ... -
execute immediate
2012-01-12 21:41 1240EXECUTE IMMEDIATE Statement ... -
【实验】【PROCEDURE】一个最简单的oracle存储过程"proc_helloworld"
2011-08-08 09:51 1250本文通过一个最简单的oracle存储过程"proc_ ... -
创建oracle job
2011-07-27 17:20 896oracle job简介 主要的使用情景 定时在后台执行 ...
相关推荐
在Oracle数据库中,Bulk Collect是一个非常实用的特性,它允许我们一次从游标(Cursor)中批量地获取多行数据,极大地提高了处理大量数据时的性能。本文将深入讲解如何在PL/SQL中使用Bulk Collect实现Cursor的批量...
Oracle BULK COLLECT是Oracle数据库提供的一种高级PL/SQL特性,用于提高...在实际开发中,应当根据具体业务需求和数据规模灵活运用BULK COLLECT,结合其他优化策略,比如绑定变量、索引优化等,以达到最佳的性能效果。
批量绑定技术的核心在于减少PL/SQL和SQL引擎之间的上下文切换次数,从而提高效率。在传统的SQL语句执行过程中,每次SQL的执行都需要PL/SQL引擎和SQL引擎之间的切换,这会消耗一定的系统资源。而批量绑定则一次性处理...
例如,我们可以从CSV文件中读取数据,然后使用BULK COLLECT INTO将这些数据批量插入到表中。 3. **FORALL**:在收集了大量数据后,可以使用FORALL语句一次性将它们插入到数据库中,避免了循环中的单次插入,提高了...
其中,`FORALL`语句作为Oracle PL/SQL的一个强大特性,提供了批量绑定和批量收集的能力,能够显著提升处理大量数据时的效率。本文将深入探讨`FORALL`的使用方法及其背后的原理,帮助开发者更好地理解和应用这一功能...
它在发送SQL语句到SQL引擎之前,先将输入集合批量绑定。 2. **批绑定提高性能**: 批绑定通过一次性处理多个数据项,显著减少了PL/SQL与SQL引擎之间的通信次数。这包括三种类型的绑定操作: - in-bind(输入绑定...
2. **批量数据处理**:通过`bulk collect into rec`语句,一次获取多行数据到`rec`变量中,然后再遍历这个集合进行更新操作,这正是利用了绑定变量进行批量数据处理的典型应用。 3. **安全性与效率**:通过使用绑定...
1. **Oracle批量绑定(Bulk Bind)**:批量绑定是Oracle提供的一种优化SQL语句执行的方式,特别是对于大量数据操作。`FORALL`与`BULK COLLECT`是PL/SQL中的两个关键字,它们一起用于在存储过程或函数中执行批量DML操作...
对于大量相似的更新操作,可以考虑使用BULK COLLECT和FORALL语句进行批量处理,以减少网络和数据库调用的开销: ```sql DECLARE TYPE col_table IS TABLE OF table_name.column_name%TYPE INDEX BY PLS_INTEGER; ...
- 使用`BULK COLLECT INTO`语句,可以一次收集多行数据到集合中,然后批量插入,减少与数据库的交互次数,提升性能。 - 使用`FORALL`语句与`BULK COLLECT`配合,可以避免循环中每次的DML操作,降低开销。 3. **...
在Oracle 9i及其以后的版本中,还增加了使用BULK COLLECT子句批量绑定数据和使用CURSOR表达式实现嵌套游标的功能。本章将主要介绍如何使用显式游标进行多行数据的查询、游标FOR循环以及游标变量的使用,另外还将介绍...
"Oracle优化笔记"可能涵盖了如何有效地优化SQL查询,特别是针对where条件的编写技巧,以及如何利用FORALL和BULK COLLECT等特性来提升性能。下面我们将详细探讨这些关键知识点。 1. **SQL优化基础**: SQL优化的...
批量绑定是指在一个操作中同时处理多条记录的技术。通过使用`FORALL`语句,可以在一次操作中插入、更新或删除多个记录。 示例代码: ```plsql DECLARE TYPE rec_type IS RECORD (id NUMBER, name VARCHAR2(50)); ...
当需要将查询结果集批量插入到一个PL/SQL表类型的变量`indexed_var`时,可以使用`BULK COLLECT INTO`子句。 在示例代码中,可以看到如何动态构建并执行函数调用。例如,`str_mult`函数的动态执行通过`EXECUTE ...
集合写法(飞机速度)是通过一次性处理多个行来加速数据操作,如BULK COLLECT INTO和FORALL语句。这种技术将查询时间缩短到0.22秒,极大地提高了处理大量数据的速度。 5. **直接路径插入**: 直接路径插入避免了...
- **PL/SQL中的批量绑定变量**: - **FORALL循环**: FORALL语句用于执行批量更新、插入或删除操作。 - 示例: `FORALL i IN 1..x.COUNT INSERT INTO t VALUES (x(i));` - **BULK COLLECT**: BULK COLLECT用于收集多...
在实际应用中,为了进一步提高性能,可以结合Oracle的`BULK COLLECT`和`FORALL`语句,以及使用绑定变量来处理大量数据。此外,对于超大规模的数据导入,可以考虑使用`SQL*Loader`工具,它能快速高效地从外部文件导入...
`FORALL`关键字可以用于一次性对集合中的所有元素执行操作,而`BULK COLLECT`子句则用于在将结果集返回到PL/SQL之前进行批量绑定,这在处理查询结果时非常高效。 嵌套表是数据库中嵌套的表结构,可以直接使用SQL...
5. **PL/SQL中的批量绑定变量(FORALL):** - `FORALL`循环可以用于批量插入、更新或删除数据。 ```sql FORALL i IN 1..x.COUNT INSERT INTO t (col1, col2) VALUES (x(i).col1, x(i).col2); ``` - 使用`SQL%...
#### 7.12.3 在 DELETE 语句上使用批量绑定 一次删除多个行。 ```sql FORALL i IN 1..v_employees.COUNT DELETE FROM employees WHERE employee_id = v_employees(i); ``` ### 十二、FORALL 语句 #### 7.13.1 在...