加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

实战BULK COLLECT(成批聚合类型)和数组集合type类型is table of

发布时间:2020-12-14 05:40:53 所属栏目:百科 来源:网络整理
导读:? 例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?dept
?

例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 元素所作用的行数

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读