例1: 批量查询部门号为 "10" 号的并把它们打印出来 .
DECLARE
TYPEemp_table_typeISTABLEOFmy_emp%ROWTYPEINDEXBYBINARY_INTEGER;
v_emp_tableemp_table_type;
BEGIN
SELECT*BULKCOLLECTINTOv_emp_tableFROMmy_empWHEREdeptno=&deptno;
FORiIN1..v_emp_table.COUNTLOOP
dbms_output.put_line('EMPLOYEE_INFO:'||v_emp_table(i).ename||
','||v_emp_table(i).job||
','||v_emp_table(i).hiredate);
ENDLOOP;
END;
说明部分:
1. DECLARE 说明以下你要声明的部分
2. Type声明是类型 emp_table_typ e类型的名字
3. ISTABLEOF 指定是一个集合的表的数组类型, 简单的来说就是一个可以存储一列多行的数据类型 , my_emp 指出在哪个表上( 存在的表 ) %ROWTYPE 指在表上的行的数据类型.
4. INDEXBYBINARY_INTEGER 指索引组织类型
5. v_emp_table 定义一个变量来存储集合数据类型
6. BULKCOLLECTINTO 指是一个成批聚合类型, 简单的来说 , 它可以存储一个多行多列存储类型 ,into 后面指定从哪里来 ,
7. v_emp_table.COUNT 用来 v_emp_table 里面的数量
8. (i)表示下标号
例2: 批量更新部门号为 "10" 的员工工资
DECLARE
TYPEename_table_typeISTABLEOFmy_emp.ename%TYPE;
TYPEsal_table_typeISTABLEOFmy_emp.sal%TYPE;
v_ename_tableename_table_type;
v_sal_tablesal_table_type;
BEGIN
UPDATEmy_empSETsal=sal*1.20WHEREdeptno=&deptnoRETURNINGename,sal
BULKCOLLECTINTOv_ename_table,v_sal_table;
FORiIN1..v_ename_table.COUNTLOOP
dbms_output.put_line('EMPLOYEE_INFO:'||v_ename_table(i)||','||v_sal_table(i));
ENDLOOP;
END;
说明部分:
1. %TYPE和 my_emp.ename 数据类型一样
v_ename_tableename_table_type;
2. v_sal_tablesal_table_type;定义变量来存储它们 .
3. RETURNING用来指定要返回的部分 ,BULKCOLLECTINTO 成批聚合类型
4. 用for 把它们打印出来
(总结 ):
1. 实验时把setserveroutputon 打开
2. 以上的例子的目的主要是为了提高性能. 这里的性能主要指的是速度 . 如果综合的从整个 OLTP 或者 OLAP 系统的话就是另外一回事了 , 不以这里讨论 .
3. 速度指的是批量插入, 更新 , 删除 , 为什么会提高速度呢 ?
4. 提取到的数据都在内存中进行处理, 因为在内存处理比较快 , 这是常识 .
5. 附以下几个例子大家自己看吧.
例3 :批量插入
CREATETABLEmy_emp(empnonumber(4),enamevarchar2(15))
/
DECLARE
TYPEempno_table_typeISTABLEOFnumber(4)INDEXBYBINARY_INTEGER;
TYPEename_table_typeISTABLEOFvarchar2(20)INDEXBYBINARY_INTEGER;
v_empno_tableempno_table_type;
v_ename_tableename_table_type;
BEGIN
FORiIN1..1000LOOP
v_empno_table(i):=i+2000;
v_ename_table(i):='NAME'||to_char(i);
ENDLOOP;
FORALLiIN1..v_empno_table.COUNTINSERTINTOmy_empVALUES(v_empno_table(i),v_ename_table(i));
END;
/
例4: 批量更新
CREATETABLEmy_emp(empnonumber(4),enamevarchar2(15))
/
DECLARE
TYPEempno_table_typeISTABLEOFmy_emp.empno%TYPEINDEXBYBINARY_INTEGER;
TYPEename_table_typeISTABLEOFmy_emp.ename%TYPEINDEXBYBINARY_INTEGER;
v_empno_tableempno_table_type;
v_ename_tableename_table_type;
BEGIN
FORiIN1..1000LOOP
v_empno_table(i):=i+2000;
v_ename_table(i):='CN'||to_char(i);
ENDLOOP;
FORALLiIN1..v_empno_table.COUNTUPDATEmy_empSETename=v_ename_table(i)WHEREempno=v_empno_table(i);
END;
/
例5 :批量删除
DECLARE
TYPEempno_table_typeISTABLEOFmy_emp.empno%TYPEINDEXBYBINARY_INTEGER;
v_empno_tableempno_table_type;
BEGIN
FORiIN1..8LOOP
v_empno_table(i):=i+2000;
ENDLOOP;
FORALLiIN1..3DELETEFROMmy_empWHEREempno=v_empno_table(i);
END;
/
例6 : SQL%BULK_ROWCOUNT 属性
DECLARE
TYPEdeptno_table_typeISTABLEOFnumber(2);
v_deptno_tabledeptno_table_type:=deptno_table_type(10,20,30);
BEGIN
FORALLiIN1..v_deptno_table.COUNTUPDATEemp2SETsal=sal*0.5WHEREdeptno=v_deptno_table(i);
dbms_output.put_line('DEPARTMENT_10:'||SQL%BULK_ROWCOUNT(1)||'rows');
dbms_output.put_line('DEPARTMENT_10:'||SQL%BULK_ROWCOUNT(1)||'rows');
dbms_output.put_line('DEPARTMENT_20:'||SQL%BULK_ROWCOUNT(2)||'rows');
dbms_output.put_line('DEPARTMENT_30:'||SQL%BULK_ROWCOUNT(3)||'rows');
END;
/
SQL%BULK_ROWCOUNT(i)表示 FORALL 语句第 i 元素所作用的行数
分享到:
相关推荐
BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记。 例1: 批量查询项目资金账户号为 “320001054663”的房屋账户信息并把它们打印出来 . DECLARE TYPE acct_...
1. 定义类型:TYPE toffsetlist IS TABLE OF TMP_PC_OFFSET_PROFITLOSS%ROWTYPE INDEX BY LS_INTEGER; v_offset toffsetlist; 2. 读取数据:select * from TMP_PC_OFFSET_PROFITLOSS BULK COLLECT INTO v_offset ......
TYPE t_table IS TABLE OF VARCHAR2(10 ) INDEX BY VARCHAR2 (2); v_t_table t_table; TYPE t_pg3 IS TABLE OF asis.PG3_AGENTCD_CONVERSION% ROWTYPE; v_pg3_table t_pg3; c_pg3_vendor com.cRef; v_str VARCHAR2...
记录 集合 BULK COLLECT FORALL 执行计划
在一般的情况下,使用批量fetch... type v_code_type is table of t_depart.depart_code%type ; v_code v_code_type ; type v_name_type is table of t_depart.depart_name%type ; v_name v_name_t
Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
采用bulk collect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理。可以在select into,fetch into,returning into语句使用bulk collect。注意在使用bulk collect时,所有的into变量都...
结合一个存储过程的实例,介绍了 bulk collect 的使用
bulk collect函数的使用,可以可以提高数据的访问效率
bulk collect bulk collect bulk collect例子特殊应用
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 ...
我们知道PL/SQL程序中运行SQL语句是存在...下面详解这爷俩㈠ 通过BULK COLLECT 加速查询⑴ BULK COLLECT 的用法采用BULK COLLECT可以将查询结果一次性地加载到collections中,而不是通过cursor一条一条地处理可以在sele
Oracle 遍历游标的四种方式(for、fetch、while、bulk collect+forall) 2.问题分析 我们可以把游标想象成一张表,想要遍历游标,就要取到游标的每行数据,所以问题的关键就成了:如何取到行数据? 3.解决方案 ...
The CONSTANT_NameAndType_info Table Fields Methods Attributes The Code Attribute The ConstantValue Attribute The Exceptions Attribute The InnerClasses Attribute The LineNumberTable Attribute ...
Collect是用 Visual C++ 语言开发的
1.FORALL 用法小结 ...5.用BULK COLLECT子句取回查询结果至集合中 6.用LIMIT 子句限制批取出操作行 7.用RETURNING INTO子句取回DML结果至集合 8.SQL优化学习笔记 9.给Oracle存储过程传入数组(这是自己的)
It discusses various applications of the theory of measures of noncompactness, in particular, by addressing the results and methods of fixed-point theory. The concept of a measure of noncompactness ...