以前沒有遇到過數組這種類型,最近遇到了需要數組才能解決問題,找了一下關於數組的用法,現整理下來。
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;