Oracle之數組


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

 

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;

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM