oracle常用的复合数据类型 : BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer

例1: 批量 查询部门号为 "10"
号的并把它们打印出来 .

DECLARE

TYPE emp_table_type IS TABLE OF my_emp%ROWTYPE INDEX BY
BINARY_INTEGER;

v_emp_table emp_table_type;

BEGIN

SELECT * BULK COLLECT INTO v_emp_table FROM my_emp WHERE
deptno=&deptno;

FOR i IN 1..v_emp_table.COUNT LOOP

dbms_output.put_line(‘EMPLOYEE_INFO:‘||v_emp_table(i).ename||

‘,‘||v_emp_table(i).job||

‘,‘||v_emp_table(i).hiredate);

END LOOP;

END;

说明部分:

1.
DECLARE
说明以下你要声明的部分

2.
Type 声明是类型
emp_table_typ e
类型的名字

3.
IS TABLE OF 指定是一个集合的表的数组类型,
简单的来说就是一个可以存储一列多行的数据类型 ,
my_emp 指出在哪个表上(
存在的表 )
%ROWTYPE 指在表上的行的数据类型.

4.
INDEX BY
BINARY_INTEGER
指索引组织类型

5.
v_emp_table 定义一个变量来存储集合数据类型

6.
BULK COLLECT INTO
指是一个成批聚合类型,
简单的来说 ,
它可以存储一个多行多列存储类型 ,into
后面指定从哪里来 ,

7.
v_emp_table.COUNT
用来 v_emp_table
里面的数量

8.
(i)表示下标号

例2:
批量 更新部门号为 "10"
的员工工资

DECLARE

TYPE
ename_table_type IS TABLE OF my_emp.ename%TYPE;

TYPE
sal_table_type IS TABLE OF my_emp.sal%TYPE;

v_ename_table ename_table_type;

v_sal_table sal_table_type;

BEGIN

UPDATE my_emp
SET sal=sal*1.20 WHERE deptno=&deptno RETURNING ename,sal

BULK COLLECT
INTO v_ename_table,v_sal_table;

FOR i IN
1..v_ename_table.COUNT LOOP

dbms_output.put_line(‘EMPLOYEE_INFO:‘||v_ename_table(i)||‘,‘||v_sal_table(i));

END
LOOP;

END;

说明部分:

1. %TYPE和
my_emp.ename 数据类型一样

v_ename_table ename_table_type;

2.    v_sal_table
sal_table_type; 定义变量来存储它们 .

3. RETURNING 用来指定要返回的部分
,BULK COLLECT INTO 成批聚合类型

4. 用for
把它们打印出来

(总结
):

1. 实验时把set
serveroutput on 打开

2. 以上的例子的目的主要是为了提高性能.
这里的性能主要指的是速度 .
如果综合的从整个 OLTP
或者 OLAP
系统的话就是另外一回事了 ,
不以这里讨论 .

3. 速度指的是批量插入,
更新 ,
删除 ,
为什么会提高速度呢 ?

4. 提取到的数据都在内存中进行处理,
因为在内存处理比较快 ,
这是常识 .

5. 附以下几个例子大家自己看吧.

例3
:批量插入

CREATE TABLE
my_emp(empno number(4),ename varchar2(15))

/

DECLARE

TYPE
empno_table_type IS TABLE OF number(4) INDEX BY BINARY_INTEGER;

TYPE
ename_table_type IS TABLE OF varchar2(20) INDEX BY BINARY_INTEGER;

v_empno_table empno_table_type;

v_ename_table ename_table_type;

BEGIN

FOR i IN
1..1000 LOOP

v_empno_table(i):=i+2000;

v_ename_table(i):=‘NAME‘||to_char(i);

END
LOOP;

FORALL i IN 1..v_empno_table.COUNT  INSERT INTO my_emp
VALUES(v_empno_table(i),v_ename_table(i));

END;

/

例4:
批量更新

CREATE TABLE
my_emp(empno number(4),ename varchar2(15))

/

DECLARE

TYPE
empno_table_type IS TABLE OF my_emp.empno%TYPE INDEX BY
BINARY_INTEGER;

TYPE
ename_table_type IS TABLE OF my_emp.ename%TYPE INDEX BY
BINARY_INTEGER;

v_empno_table empno_table_type;

v_ename_table ename_table_type;

BEGIN

FOR i IN
1..1000 LOOP

v_empno_table(i):=i+2000;

v_ename_table(i):=‘CN‘||to_char(i);

END
LOOP;

FORALL i IN 1..v_empno_table.COUNT UPDATE my_emp SET ename=v_ename_table(i)
WHERE empno=v_empno_table(i);

END;

/

例5
:批量删除

DECLARE

TYPE
empno_table_type IS TABLE OF my_emp.empno%TYPE INDEX BY
BINARY_INTEGER;

v_empno_table empno_table_type;

BEGIN

FOR i IN 1..8
LOOP

v_empno_table(i):=i+2000;

END
LOOP;

FORALL i IN
1..3  DELETE FROM my_emp WHERE empno=v_empno_table(i);

END;

/

例6
: SQL%BULK_ROWCOUNT
属性

DECLARE

TYPE
deptno_table_type IS TABLE OF number(2);

v_deptno_table deptno_table_type:=deptno_table_type(10,20,30);

BEGIN

FORALL i IN 1.. v_deptno_table.COUNT UPDATE emp2 SET sal=sal*0.5 WHERE
deptno=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 元素所作用的行数

oracle常用的复合数据类型 : BULK COLLECT(成批聚合类型)和数组集合type类型is table of
表%rowtype index by binary_integer

时间: 2024-10-12 21:45:30

oracle常用的复合数据类型 : BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer的相关文章

Oracle数据库之FORALL与BULK COLLECT语句

   我们再来看一下PL/SQL块的执行过程:当PL/SQL运行时引擎处理一块代码时,它使用PL/SQL引擎来执行过程化的代码,而将SQL语句发送给SQL引擎来执行:SQL引擎执行完毕后,将结果再返回给PL/SQL引擎.这种在PL/SQL引擎和SQL引擎之间的交互,称为上下文交换(context switch).每发生一次交换,就会带来一定的额外开销. FORALL,用于增强PL/SQL引擎到SQL引擎的交换. BULK COLLECT,用于增强SQL引擎到PL/SQL引擎的交换.(前面我们已经

Oracle PL/SQL复合数据类型

复合数据类型大致可以分为两类.一类是记录类型,适用于处理单行多列数据,有点类似于java中的VO:一类是集合类型,适用于处理单列多行的数据,类似java中的List,以下实验在11.2.0.1.0版本下做的. 1.记录类型 drop table test purge; create table test ( id number(2), name varchar2(60) ); insert into test values(1,'aaa'); insert into test values(2,

ORACLE批量绑定FORALL与BULK COLLECT

FORALL与BULK COLLECT的使用方法: 1.使用FORALL比FOR效率高,因为前者只切换一次上下文,而后者将是在循环次数一样多个上下文间切换. 2.使用BLUK COLLECT一次取出一个数据集合,比用游标条取数据效率高,尤其是在网络不大好的情况下.但BLUK COLLECT需要大量内存. 例子: Sql代码   create table test_forall ( user_id number(10), user_name varchar2(20)); select into 中

oracle中的复合数据类型

1)显示定义记录类型: declare --显示定义一个record类型myrec type myrec is RECORD ( combine_no VARCHAR2(10), department_code VARCHAR2(11) ); -- 声明一个myrec类型的变量rcd: rcd myrec; begin select nr.combine_no,nr.department_code  into rcd from rate_combine_nr nr where nr.combin

mysql与oracle常用函数及数据类型对比

最近在转一个原来使用oracle,打算改为mysql的系统,有些常用的oracle函数的mysql实现顺便整理了下,主要是系统中涉及到的(其实原来是专门整理过一个详细doc的,只是每次找word麻烦). 特性 oracle mysql 字符串转日期 to_date str_to_date 日期类型 date 公元前4712年1月1日至公元9999年12月31日 datetime:取值范围:1000-01-01 00:00:00 到 9999-12-31 23:59:59 timestamp:取值

FORALL和BULK COLLECT

参考:http://www.cnblogs.com/hellokitty1/p/4584333.html 用户在通过PLSQL编写程序时,PLSQL通常会在操作上进行交互,当用户通过PLSQL执行一条更新语句时,SQL会将更新后的数据返回给PLSQL,这样用户才可以在PLSQL之中取得更新后的数据,但是如果在PLSQL之中要进行大量的数据操作时,这种方式就会使程序执行性能大大降低. 例如:通过PLSQL执行多行数据更新 1 DECLARE 2 TYPE emp_array_type IS VAR

FORALL与BULK COLLECT是实现批量SQL

2014年11月20日,星期四 更新 1. 示例1 declare/*    type card_rec_type is record    ( dn_no channel.dn_no%type,        channel_id channel.channel_id%type);    type nested_card_type is table of card_rec_type;    card_tab nested_card_type; */    cursor card_rec is 

oracle学习之bulk collect用法

Oracle8i中首次引入了Bulk Collect特性,该特性可以让我们在PL/SQL中能使用批查询,批查询在某些情况下能显著提高查询效率. 采用bulk collect可以将查询结果一次性地加载到collections中. 而不是通过cursor一条一条地处理. 可以在select into,fetch into,returning into语句使用bulk collect. 注意在使用bulk collect时,所有的into变量都必须是collections <span style=&quo

【PLSQL】PLSQL中复合数据类型

1,常见的操作数据库的技术有那些 jdbc     使用java 访问数据库的技术    PLSQL  (procedure  过程化sql) 在数据库内部操作数据的技术    proc/c++    c 和 c++ 访问数据库的技术    ODBC      微软提供访问数据库的技术    OCI          oracle  底层的连接接口 2,Oracle中的复合数据类型 Oracle中的复合数据类型record,table,cursor 2.1 record类型 2.1.1 语法 /