- 浏览: 329069 次
- 性别:
- 来自: 西安
文章分类
最新评论
-
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 679/* 标题:SQL中 -
mysql update注意
2016-01-18 16:16 559drop table a; CREATE TABLE IF ... -
Oracle中JOB的创建方法以及一个细节的探究(转)
2012-10-15 16:35 1235在Oracle中可以使用JOB来实现一些任务的自动化执行,类似 ... -
oracle里的job和schedule有什么区别(转)
2012-10-15 16:31 1296510g 中新推出的SCHEDULER可能确实会让很多初接触的朋 ... -
procedure的加密
2012-08-06 14:34 744wrap 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 15051.GOTO,主要用于跳转,但会打乱我们的程序逻辑,一般不使用 ... -
(转)PL/SQL --> 动态SQL的常见错误
2012-03-22 18:31 1395--============================ ... -
Oracle SELECT with an array using an IN
2012-01-18 17:03 1282Oracle SELECT with an ... -
pl/sql 实现类似于split 的分割字符串的功能
2012-01-12 23:55 61031、先建立一个包,定义数组类型:CREATE OR REP ... -
c#向pl/sql传递数组参数
2012-01-12 23:48 38601.OracleParameterpout1=OracleDb ... -
execute immediate
2012-01-12 21:41 1203EXECUTE IMMEDIATE Statement ... -
【实验】【PROCEDURE】一个最简单的oracle存储过程"proc_helloworld"
2011-08-08 09:51 1219本文通过一个最简单的oracle存储过程"proc_ ... -
创建oracle job
2011-07-27 17:20 844oracle job简介 主要的使用情景 定时在后台执行 ...
相关推荐
Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
采用bulk collect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理。可以在select into,fetch into,returning into语句使用bulk collect。注意在使用bulk collect时,所有的into变量都...
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
结合一个存储过程的实例,介绍了 bulk collect 的使用
记录 集合 BULK COLLECT FORALL 执行计划
sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO vsal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT ...
bulk collect函数的使用,可以可以提高数据的访问效率
bulk collect bulk collect bulk collect例子特殊应用
BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记。对oracle批量查询 删除 更新使用bulk collect提高效果的相关知识感兴趣的朋友通过本文一起学习吧
代码如下: — Created on 2010/11/04 by WANGNAN declare — Local variables here i integer; TYPE t_table IS TABLE OF VARCHAR2(10 ) INDEX BY VARCHAR2 (2); v_t_table t_table; TYPE t_pg3 IS TABLE OF asis.PG...
我们知道PL/SQL程序中运行SQL语句是存在...下面详解这爷俩㈠ 通过BULK COLLECT 加速查询⑴ BULK COLLECT 的用法采用BULK COLLECT可以将查询结果一次性地加载到collections中,而不是通过cursor一条一条地处理可以在sele
在一般的情况下,使用批量fetch的几率并不是很多,但是Oracle提供了这个功能我们最好能熟悉一下,说不定什么时候会用上它。 代码如下:declare cursor c1 is select * from t_depart; v_depart t_depart%...
Oracle 遍历游标的四种方式(for、fetch、while、bulk collect+forall) 2.问题分析 我们可以把游标想象成一张表,想要遍历游标,就要取到游标的每行数据,所以问题的关键就成了:如何取到行数据? 3.解决方案 ...
Collect是用 Visual C++ 语言开发的
COLLECT
abap collect的用法与实例 abap collect的用法与实例