Oracle中的數組分為固定數組和可變數組。
一、固定數組
固定數組:在定義的時候預定義了數組的大小,在初始化數組時如果超出這個大小,會提示ORA-06532:超出小標超出限制!
語法:
TYPE arry_var IS VARRAY(2) OF VARCHAR2(10);--定義了一個存放2個char類型的數組
例:
DECLARE
-- declare fixed array
TYPE arry_var IS VARRAY(2) OF VARCHAR2(10);
arry_name arry_var;
BEGIN
-- init array
arry_name := arry_var('tom', 'jim','tim'); --注:此處初始化了三個值,會報錯
dbms_output.put_line(arry_name(1));
dbms_output.put_line(arry_name(2));
END;
二、可變數組
可變數組:在數組中可以有任意數量的元素,元素的類型要預先定義,數組的下標可以設置為自增.
1、一維數組
1)下標為自增長,table 表示可變長度,index by bybinary_integer子句代表以符號整數為索引
語法:
TYPE t_table IS TABLE OF VARCHAR2(30) INDEX BYBINARY_INTEGER;
例:
DECLARE
TYPE t_table IS TABLE OF VARCHAR2(30) INDEX BYBINARY_INTEGER;
v_table t_table;
v_cnt NUMBER;
BEGIN
v_table(1) := '1';
v_table(2) := '3';
v_table(3) := '9';
v_cnt := v_table.COUNT;
FOR i IN 1 .. v_cnt LOOP
dbms_output.put_line(v_table(i));
END LOOP;
END;
輸出為:1 3 9 ,此處的1 3 9是以字符型存放在數組中
注:Oracle中的數組下標是從1開始的,下標必須是連續的。
2、多維數組
多維數組:可以看作是嵌套表,視為表中之表,可以有任意數量的元素,不需要預先定義限制值。
1).Create Table
create table XXUSER
(
USER_ID NUMBER,
USER_NAME VARCHAR2(255),
SEX VARCHAR2(2),
AGE NUMBER(3),
ADDRESS VARCHAR2(2000)
)
2).定義結果集(Record),存放xxuser中的部分字段
DECLARE
-- only 2 fileds
TYPE t_record_user IS RECORD(
user_id xxuser.user_id%type,
user_name xxuser.user_name%type
);--此處只用到了xxuser表中的兩個字段
TYPE t_user IS TABLE OF t_record_user INDEX BY BINARY_INTEGER;
v_arry_user t_user;
BEGIN
SELECT user_id, user_name BULK COLLECT INTO v_arry_user FROM xxuser; --BULK COLLECT表示將批量查詢數據直接插入collection中,而不是通過cursur一條條插入;在現在的程序中大部分實現是通過游標插入的。
FOR i IN 1 .. v_arry_user.COUNT LOOP
dbms_output.put_line(v_arry_user(i).user_name); --多維數組的調用方式
END LOOP;
END;
3).使用ROWTYPE,存放xxuser的全部字段,比Record簡潔。
DECLARE
-- ALL,XXUser(user_id, user_name, sex, age, address)
TYPE t_user IS TABLE OF xxuser%ROWTYPE INDEX BY BINARY_INTEGER;
v_arry_user t_user;
BEGIN
SELECT * BULK COLLECT INTO v_arry_user FROM xxuser;
FOR i IN 1 .. v_arry_user.COUNT LOOP
dbms_output.put_line(v_arry_user(i).user_name || v_arry_user(i).sex);
END LOOP;
END;
/*
1.COUNT 返回集合中元素的個數
2.DELETE 刪除集合中所有元素
3.DELETE(x) 刪除元素下標為x的元素 對VARRAY非法
4.DELETE(x,y) 刪除元素下標從X到Y的元素 對VARRAY非法
5.EXIST(x) 如果集合元素x已經初始化,則返回TRUE, 否則返回FALSE
6.EXTEND 在集合末尾添加一個元素 對Index_by非法
7.EXTEND(x) 在集合末尾添加x個元素 對Index_by非法
8.EXTEND(x,n) 在集合末尾添加元素n的x個副本 對Index_by非法
9.FIRST 返回集合中的第一個元素的下標號,對於VARRAY集合始終返回1。
10.LAST 返回集合中最后一個元素的下標號, 對於VARRAY返回值始終等於COUNT.
11.LIMIT 返回VARRY集合的最大的元素個數 Index_by集合和嵌套表無用
12.NEXT(x) 返回在第x個元素之后及緊挨着它的元素值,如果x是最后一個元素,返回null.
13.PRIOR(x) 返回在第x個元素之前緊挨着它的元素的值,如果x是第一個元素,則返回null。
14.TRIM 從集合末端開始刪除一個元素 對於index_by不合法
15.TRIM(x) 從集合末端開始刪除x個元素
var_array.next(3); //返回var_array(3)
*/
轉自:https://www.cnblogs.com/chenchengfei/p/9133385.html、https://www.cnblogs.com/kubimiantiao/p/3795778.html