PLSQL入门与精通(第65章:批量绑定FORALL 使用数组部分索引的用法)

上一次,我们介绍了配列的索引不连续的情况下FORALL语句的用法。
但是,在通常情况下,配列的数据都是连续的,或者其中部分数据使我们想试用的数据,
一部分是不想用的数据,这时候也可以通过FORALL语法进行批量绑定。
方法是我们可以将需要的的配列的索引拿出来,放到另外一个配列中使用ForALL。

例如,配列的索引为“1、2、3”时,我们只想用其中的“1、3”2个索引进行FORALL,我们就可以吧“1、3”
的值保存在其他配列中,通过这个中间的配列的值,从而在FORALL中去使用配列原来的数据。

我们把要处理的数据的数组被称为“数据配列”,要处理数据的索引的数组被称为“索引配列”。

“数据配列”结合“索引配列”就可以使用FORALL了,语法如下:索引配列双方的的语法如下:
配列

FORALL 带字母变量 IN VALES OF 索引配列 ◆◆◆◆◆
使用数据配列的一个DML语句;

我们看一下看具体例子:

首先,索引配列,是存储索引(BINARY INTYEGER型)的配列,所以他的类型是「TABLE OF BINARY INTERGER」。
并且,索引配列的索引的类型也是BINARY INTERGER型。
配列的索引的类型,是固定的词句,「INDEX BY BINARY INTERGER」。

索引配列的类型如下定义:
TYPE 类型名称 IS TABLE OF BINARY INTERGER INDEX BY BINARY INTERGER;

和上次一样,准备了A列、B列的TEST01表,A列用的数据配列A_TAB,B列用的数据配列B_TAB使用,
为了便于验证,将其保存在包PAC1中。

另外,这次还要使用索引配列,变量为C_TAB,同样也保存在包PAC1中。

首先是TEST01表

SQL> DESC TEST01
名称 格式


A NUMBER
B VARCHAR2(10)

接下来创建A_TAB、B_TAB、C_TAB的包PAC1。

SQL> L

CREATE OR REPLACE PACKAGE PAC1
//
– 创建包
/
/
IS
/******************************/
– A列用的配列 (数据配列)
/******************************/

 TYPE A_TAB_TYPE IS TABLE OF TEST01.A%TYPE
 INDEX BY BINARY_INTEGER;
 A_TAB   A_TAB_TYPE;
/******************************/
--B列用的配列 (数据配列)
/******************************/

 TYPE B_TAB_TYPE IS TABLE OF TEST01.B%TYPE
 INDEX BY BINARY_INTEGER;
 B_TAB   B_TAB_TYPE;

/******************************/
--  对象索引用的配列 (索引配列) 
/******************************/
 TYPE C_TAB_TYPE IS TABLE OF BINARY_INTEGER
 INDEX BY BINARY_INTEGER;
 C_TAB   C_TAB_TYPE;

END ;
/

包已创建。

这里,C_TAB_TYPE是存储对象索引用的数组(或者叫做配列)的定义。

就和上次一样,A列用的数据配列和B列用的数据配的索引值1号~3号保存到配列里。

和上次一样,下面的代码如下。

SQL>
BEGIN
PAC1.A_TAB(1) := 10; PAC1.A_TAB(2) := 20; PAC1.A_TAB(3) := 30;
PAC1.B_TAB(1) := ‘A’ ; PAC1.B_TAB(2) := ‘B’ ; PAC1.B_TAB(3) := ‘C’ ;
END ;
/

PL/SQL过程成功完成。

这样,PAC1包里的A_TAB、B_TAB配列中存储了索引1号~3号的数据。

这次我想把数据配列索引是1号和3号的数据通过FORALL,INSERT到TEST01表里。

也就是说数据配列的索引2号不在插入的对象范围内。

为此,我们增加了一个索引配列C_TAB,里边存储了数据配列的对象索引值1和3。

C_TAB配列的索引值是任何值都可以,确保里边的所有对象都是我们需要的对象即可。
这里我们用的是10号、20号。

SQL> L

BEGIN
PAC1.C_TAB(10) := 1;
PAC1.C_TAB(20) := 3;
END ;
/

PL/SQL过程成功完成。

这样,值1和3被存储在PAC1包的C_TAB配列里,改索引配列的索引值是10和20。
C_TAB配列对应的数据值分别是“1和3”。

现在查看TEST01表的数据,是0件:

SQL> SELECT * FROM TEST01;

没有选择记录。

那么,我们使用数据配列A_TAB、B_TABx、索引配列C_TAB,通过FORALL语法往TEST01表中用插入这2条数据。

SQL> L
BEGIN
FORALL J IN VALUES OF PAC1.C_TAB
INSERT INTO TEST01(A,B) VALUES (PAC1.A_TAB(J), PAC1.B_TAB(J));
END ;
/

PL/SQL过程成功完成。

因此,索引配列PAC1.C_TAB的值(VAULES OF PAC1.C_TAB),即1和3,把这2个索引值作为索引J,
将PAC1.A_TAB(J)、PAC1.B_TAB(J)的值通过FORALL语法,用批量配列的方式往TEST01表中统一插入数据。

重点是“VALUES”这个关键词,是表示数组“值”的关键字。

顺便说一下,上一次的重点是“INDICES”,这个关键词是表示配列的“索引”的关键词。

确认一下结果吧。

SQL> SELECT * FROM TEST01;
A B


10 A
30 C

本章到此为止。

下次我们解说一下批量绑定语法的异常处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值