数组类型在存储过程中使⽤
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小时内删除。
发表评论