数组类型在存储过程中使⽤
oracle 之定义数组类型
注:本⽂来源:《》
oracle 数组类型,没有现成的类型,但是可以⾃⼰随意定义,很⽅便。
Oracle 数组可以分为定长数组和可变长的数组两类。以下主要是⼀维数组介绍:
1:定长数组:
1/*定长字符数组,数组⼤⼩为10*/
2 declare
3 type v_arr is varray(10) of varchar2(30);
4 my_arr v_arr;
5 my_arr:=v_arr('1','2','3');
6 begin
7for i _unt
8  loop
9  dbms_output_line(my_arr(i));
10  end loop;
11 end;
12
2:变长数组:
1/*可变长字符数组,元素⼤⼩30,索引标号integer类型⾃增长*/
2
3 type v_table    2(30)  binary_integer;
4--类型可以是前⾯的类型定义,index by binary_integer⼦句代表以符号整数为索引,
5--这样访问表类型变量中的数据⽅法就是“表变量名(索引符号整数)”。
6 my_table v_table;
7
8        i  1..20
9      loop
10          my_table(i):=i;
11          dbms_output.put_line(my_table(i));
12        loop;
13 ;
14Oracle存储过程数组集合的使⽤
注:本⽂来源《》
1 说明
1.1 RECORD
定义记录数据类型。它类似于C语⾔中的结构数据类型(STRUCTURE),PL/SQL提供了将⼏个相关的、分离的、基本数据类型的变量组成⼀个整体的⽅法,即RECORD复合数据类型。在使⽤记录数据类型变量时,需要在声明部分先定义记录的组成、记录的变量,然后在执⾏部分引⽤该记录变量本⾝或其中的成员。
定义记录数据类型的语法如下:
1 TYPE RECORD_NAME  RECORD(
2
3 V1 DATA_TYPE1 [ ][:=DEFAULT_VALUE],
4
5 V2 DATA_TYPE2 [ ][:=DEFAULT_VALUE],
6
7 VN DATA_TYPEN [ ][:=DEFAULT_VALUE]);
8
1.2 VARRAY
数组是具有相同数据类型的⼀组成员的集合。每个成员都有⼀个唯⼀的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY(variable array,即可变数组)。
定义VARRAY数据类型的语法如下:
1 TYPE VARRAY_NAMEIS VARRAY()  ELEMENT_TYPE [ ];
其中,varray_name是VARRAY数据类型的名称,size是正整数,表⽰可以容纳的成员的最⼤数量,每个成员的数据类型是element_typeo默认时,成员可以取空值,否则需要使⽤NOT NULL加以限制。1.3 TABLE
定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多⾏记录,类似于C语⾔中的⼆维数组,使得可以在PL/SQL中模仿中的表。
定义记录表类型的语法如下:
1 TYPE  NAME    ELEMENT_TYPE [ ]
2
3  [BINARY_INTEGER|PLS_INTEGER|VARRAY2];
4
关键字INDEX BY表⽰创建⼀个主键索引,以便引⽤记录表变量中的特定⾏。
BINARY_INTEGER的说明
如语句:TYPE NUMBERS  IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;其作⽤是,加了”INDEX BYBINARY_INTEGER ”后,NUMBERS类型的下标就是⾃增长,NUMBERS类型在插⼊元素时,不需要初始化,不需要每次EXTEND增加⼀个空间。
⽽如果没有这句话“INDEXBY BINARY_INTEGER”,那就得要显⽰对初始化,且每插⼊⼀个元素到NUMBERS类型的TABLE中时,都需要先EXTEND。
2 举例
2.1 创建表结构以及数据准备
1--组织机构结构表
2  SF_ORG
3 (
4 ORG_ID  , --组织机构主键ID
5 ORG_NAME 2(50),--组织机构名称
6 PARENT_ID --组织机构的⽗级
7 )
8
9--⼀级组织机构
10  SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) (1, '⼀级部门1',0);
11
12--⼆级部门
13
14  SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) (2, '⼆级部门2',1);
15  SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) (3, '⼆级部门3',1);
询并显⽰该雇员的这⼏列中的信息。注意,在使⽤RECORD数据类型的变量时要⽤“.”运算符指定记录变量名限定词。
⼀个记录类型的变量只能保存从数据库中查询出的⼀⾏记录,如果查询出了多⾏记录,就会出现错误。
1
2  TYPE TYPE_ORG_RECORD  RECORD(
3  V_ORG_NAME SF_ORG.ORG_NAME%TYPE,
4  V_PARENT_ID SF_ORG.PARENT_ID%TYPE);
5  V_ORG_RECORD TYPE_ORG_RECORD;
6
7    ORG_NAME,PARENT_ID  V_ORG_RECORD
8    SF_ORG SO
9    SO.ORG_ID=&ORG_ID;
10  DBMS_OUTPUT.PUT_LINE('部门名称:' || V_ORG_RECORD.V_ORG_NAME);
11  DBMS_OUTPUT.PUT_LINE('上级部门编码:' || TO_CHAR(V_ORG_RECORD.V_PARENT_ID));
12 ;
2.3 VARRAY的使⽤举例
存储过程 字符串转数组
先定义⼀个能保存5个VARCHAR2(25)数据类型的成员的VARRAY数据类型ORG_VARRAY_TYPE,然后声明⼀个该数据类型的VARRAY变量V_ORG_VARRAY,最后⽤与ORG_VARRAY_TYPE数据类型同名的构造函数语法给V_ORG_VARRAY变量赋予初值并显⽰赋值结果。
注意,在引⽤数组中的成员时.需要在⼀对括号中使⽤顺序下标,下标从1开始⽽不是从0开始。
1
2  TYPE ORG_VARRAY_TYPE  VARRAY(5)  2(25);
3  V_ORG_VARRAY ORG_VARRAY_TYPE;
4
5  V_ORG_VARRAY := ORG_VARRAY_TYPE('1','2','3','4','5');
6  DBMS_OUTPUT.PUT_LINE('输出1:' || V_ORG_VARRAY(1) || '、'|| V_ORG_VARRAY(2) || '、'|| V_ORG_VARRAY(3) || '、'|| V_ORG_VARRAY(4));
7  DBMS_OUTPUT.PUT_LINE('输出2:' || V_ORG_VARRAY(5));
8  V_ORG_VARRAY(5) := '5001';
9  DBMS_OUTPUT.PUT_LINE('输出3:' || V_ORG_VARRAY(5));
10 ;
2.4 TABLE使⽤举例
2.4.1 存储单列多⾏
这个和VARRAY类似。但是赋值⽅式稍微有点不同,不能使⽤同名的构造函数进⾏赋值。具体的如下:
1
2  TYPE ORG_TABLE_TYPE    2(25)
3    BINARY_INTEGER;
4  V_ORG_TABLE ORG_TABLE_TYPE;
5
6  V_ORG_TABLE(1) := '1';
7  V_ORG_TABLE(2) := '2';
8  V_ORG_TABLE(3) := '3';
9  V_ORG_TABLE(4) := '4';
10  V_ORG_TABLE(5) := '5';
11  DBMS_OUTPUT.PUT_LINE('输出1:' || V_ORG_TABLE(1) || '、'|| V_ORG_TABLE(2) || '、'|| V_ORG_TABLE(3) || '、'|| V_ORG_TABLE(4));
12  DBMS_OUTPUT.PUT_LINE('输出2:' || V_ORG_TABLE(5));
13 ;
2.4.2 存储多列多⾏和ROWTYPE结合使⽤
采⽤bulkcollect可以将查询结果⼀次性地加载到collections中。⽽不是通过cursor⼀条⼀条地处理。
1
2    TYPE T_TYPE    SF_ORG%ROWTYPE;
3    V_TYPE  T_TYPE;
4
5      ORG_ID,ORG_NAME,PARENT_ID  COLLECT  V_TYPE
6      SF_ORG
7      SF_ORG.ORG_ID <= 3;
8
9      V_INDEX  V_TYPE. .. V_TYPE. LOOP
10        DBMS_OUTPUT.PUT_LINE(V_TYPE(V_INDEX).C1 || '' || V_TYPE(V_INDEX).C2);
11      LOOP;
12  ;
2.4.3 存储多列多⾏和RECORD结合使⽤
采⽤bulkcollect可以将查询结果⼀次性地加载到collections中。⽽不是通过cursor⼀条⼀条地处理。
1
2    TYPE TEST_EMP  RECORD
3    (
4    C1 SF_ORG.ORG_NAME%TYPE,
5    C2 SF_ORG.PARENT_ID%TYPE
6    );
7    TYPE T_TYPE    TEST_EMP;
8    V_TYPE  T_TYPE;
9
10      ORG_NAME,  PARENT_ID  COLLECT  V_TYPE
11      SF_ORG
12      SF_ORG.ORG_ID <= 3;
13
14      V_INDEX  V_TYPE. .. V_TYPE. LOOP
15        DBMS_OUTPUT.PUT_LINE(V_TYPE(V_INDEX).C1 || '' || V_TYPE(V_INDEX).C2);
16      LOOP;
17  ;
Oracle存储过程⾃定义数组定义与使⽤
最近为公司项⽬数据库通过存储过程做归档,需要⽤到⾃定义数组
百度结果中很多写的都不是很清晰,可变长数组定义好后,如何使⽤。
在此做个记录:
定义:
type id_array is table of number(15) index by binary_integer;
acb_ids  id_array;
这个定义⽅式适⽤在package,如果是纯粹在存储过程中⾃定义类型请百度。
使⽤:
acb_ids(unt+1) := c_account_books_cbs_rec.acb_id;
⽹上很多实例是这样的:acb_ids(unt) := c_account_books_cbs_rec.acb_id;这样写是没有⽤的,因为这个时候acb_ids是空的,那么unt也是⽆效的,acb_ids在使⽤时回会报"未到任何数据",因此需要unt+1。
c_account_books_cbs_rec为游标遍历中的⼀个对象,上述代码意思是将游标数据中每⾏记录的ID放到⾃定义数组中,⽅便存储过程的值返回或者游标遍历外程序体中使⽤。
for x in 1 .. unt loop
do something;
end loop;
存储过程中定义参数类型为数组
注意:本⽂来源:《》
1:存储过程
1  Update_Batch_Id(p_entity_id  Number,
2                            p_vdr_id    fnd_table_of_number)
3
4
5      i  1 .. p_vdr_id. Loop
6        cux_table_header cvs
7          cvs.attribute10 = p_entity_id
8        cvs.header_id = p_vdr_id(i);
9      Loop;
10  ;
2:JAVA中调⽤
1 List list = new ArrayList();
2 ...
3 list.HeaderId());
4 ...
5
6
7  OracleCallableStatement statement = null;
8        OracleConnection oracleConnection = (JdbcConnection();
9int size = list.size();
10if (size>0)
11        {
12            Number[] vdrIdArray = (Number[])Array(new Number[size]);
13            ARRAY vdrArray=null;
14try {
15                          ArrayDescriptor tableOfNumber =
16                              oracle.ateDescriptor("FND_TABLE_OF_NUMBER",
17                                                                          oracleConnection);
18                          vdrArray = new ARRAY(tableOfNumber, oracleConnection, vdrIdArray);
19                        String sql =
20                            "BEGIN cux_XXXXXXX_pkg.Update_Batch_Id(:1,:2);end;";
21                        statement = (OracleCallableStatement)oracleConnection.prepareCall(sql);
22
23                        statement.setObject(1, batchid);
24                        statement.setARRAY(2, vdrArray);
25                        ute();
26                      }catch (Exception ex) {
27                                String[][] stra2 = { { "123456wewee", ex.getMessage() }, };
28                                LogUtil.of(stra2, this).print(pageContext);
29                            ex.printStackTrace();
30                            System.out.Message());
31                            }
32 }
——————————————————————————————————————————————————————————————————————————————————————————

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。