1. 程式人生 > >數組 類型 在 存儲過程中 使用

數組 類型 在 存儲過程中 使用

beef tac set || 引用數組 () ase rac 網上


oracle 之定義數組類型

註:本文來源:《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
  7 	for i in 1..my_arr.count
  8 	loop
  9 		dbms_output_line(my_arr(i));
 10
end loop; 11 end; 12

2:變長數組:

  1 /*可變長字符數組,元素大小30,索引標號integer類型自增長*/
  2 declare
  3 type v_table is table of varchar2(30) index by binary_integer;
  4 --類型可以是前面的類型定義,index by binary_integer子句代表以符號整數為索引,   
  5 --這樣訪問表類型變量中的數據方法就是“表變量名(索引符號整數)”。   
  6 my_table v_table;
  7 begin
  8       for i in 1..20
  9
loop 10 my_table(i):=i; 11 dbms_output.put_line(my_table(i)); 12 end loop; 13 end; 14

Oracle存儲過程 數組集合的使用

註:本文來源《 Oracle存儲過程 數組集合的使用

1 說明

1.1 RECORD

定義記錄數據類型。它類似於C語言中的結構數據類型(STRUCTURE),PL/SQL提供了將幾個相關的、分離的、基本數據類型的變量組成一個整體的方法,即RECORD復合數據類型。在使用記錄數據類型變量時,需要在聲明部分先定義記錄的組成、記錄的變量,然後在執行部分引用該記錄變量本身或其中的成員。

定義記錄數據類型的語法如下:

  1
TYPE RECORD_NAME IS RECORD( 2 3 V1 DATA_TYPE1 [NOT NULL][:=DEFAULT_VALUE], 4 5 V2 DATA_TYPE2 [NOT NULL][:=DEFAULT_VALUE], 6 7 VN DATA_TYPEN [NOT NULL][:=DEFAULT_VALUE]); 8
1.2 VARRAY

數組是具有相同數據類型的一組成員的集合。每個成員都有一個唯一的下標,它取決於成員在數組中的位置。在PL/SQL中,數組數據類型是VARRAY(variable array,即可變數組)。

定義VARRAY數據類型的語法如下:

  1 TYPE VARRAY_NAMEIS VARRAY(SIZE) OF ELEMENT_TYPE [NOT NULL];

其中,varray_name是VARRAY數據類型的名稱,size是正整數,表示可以容納的成員的最大數量,每個成員的數據類型是element_typeo默認時,成員可以取空值,否則需要使用NOT NULL加以限制。

1.3 TABLE

定義記錄表(或索引表)數據類型。它與記錄類型相似,但它是對記錄類型的擴展。它可以處理多行記錄,類似於C語言中的二維數組,使得可以在PL/SQL中模仿數據庫中的表。

定義記錄表類型的語法如下:

  1 TYPE TABLE NAME IS TABLE OF ELEMENT_TYPE [NOT NULL]
  2 
  3 INDEX BY [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 CREATE TABLE SF_ORG
  3 (
  4 ORG_ID INT NOT NULL, --組織機構主鍵ID  
  5 ORG_NAME VARCHAR2(50),--組織機構名稱  
  6 PARENT_ID INT--組織機構的父級  
  7 )
  8 
  9 --一級組織機構  
 10 INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(1, ‘一級部門1‘,0);
 11 
 12 --二級部門  
 13 
 14 INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(2, ‘二級部門2‘,1);
 15 INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(3, ‘二級部門3‘,1);
 16 INSERT INTO SF_ORG(ORG_ID, ORG_NAME, PARENT_ID) VALUES(4, ‘二級部門4‘,1);


2.2 RECORD的使用舉例

先定義一個只與SF_ORG表中某幾個列的數據類型相同的記錄數據類型TYPE_ORG_RECORD,然後聲明一個該數據類型的記錄變量V_ORG_RECORD,最後用替換變量&ORG_ID接受輸入的雇員編碼,查詢並顯示該雇員的這幾列中的信息。註意,在使用RECORD數據類型的變量時要用“.”運算符指定記錄變量名限定詞。

一個記錄類型的變量只能保存從數據庫中查詢出的一行記錄,如果查詢出了多行記錄,就會出現錯誤。

  1 DECLARE
  2   TYPE TYPE_ORG_RECORD IS 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 BEGIN
  7   SELECT ORG_NAME,PARENT_ID INTO V_ORG_RECORD
  8   FROM SF_ORG SO
  9   WHERE 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 END;


2.3 VARRAY的使用舉例

先定義一個能保存5個VARCHAR2(25)數據類型的成員的VARRAY數據類型ORG_VARRAY_TYPE,然後聲明一個該數據類型的VARRAY變量V_ORG_VARRAY,最後用與ORG_VARRAY_TYPE數據類型同名的構造函數語法給V_ORG_VARRAY變量賦予初值並顯示賦值結果。

註意,在引用數組中的成員時.需要在一對括號中使用順序下標,下標從1開始而不是從0開始。

  1 DECLARE
  2   TYPE ORG_VARRAY_TYPE IS VARRAY(5) OF VARCHAR2(25);
  3   V_ORG_VARRAY ORG_VARRAY_TYPE;
  4 BEGIN
  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 END;



2.4 TABLE使用舉例
2.4.1 存儲單列多行

這個和VARRAY類似。但是賦值方式稍微有點不同,不能使用同名的構造函數進行賦值。具體的如下:

  1 DECLARE
  2   TYPE ORG_TABLE_TYPE IS TABLE OF VARCHAR2(25)
  3   INDEX BY BINARY_INTEGER;
  4   V_ORG_TABLE ORG_TABLE_TYPE;
  5 BEGIN
  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 END;


2.4.2 存儲多列多行和ROWTYPE結合使用

采用bulkcollect可以將查詢結果一次性地加載到collections中。而不是通過cursor一條一條地處理。

  1 DECLARE
  2    TYPE T_TYPE IS TABLE OF SF_ORG%ROWTYPE;
  3    V_TYPE  T_TYPE;
  4  BEGIN
  5     SELECT ORG_ID,ORG_NAME,PARENT_ID BULK COLLECT INTO V_TYPE
  6     FROM SF_ORG
  7     WHERE SF_ORG.ORG_ID <= 3;
  8 
  9     FOR V_INDEX IN V_TYPE.FIRST .. V_TYPE.LAST LOOP
 10         DBMS_OUTPUT.PUT_LINE(V_TYPE(V_INDEX).C1 || ‘ ‘ || V_TYPE(V_INDEX).C2);
 11     END LOOP;
 12  END;


2.4.3 存儲多列多行和RECORD結合使用

采用bulkcollect可以將查詢結果一次性地加載到collections中。而不是通過cursor一條一條地處理。

  1 DECLARE
  2    TYPE TEST_EMP IS RECORD
  3    (
  4     C1 SF_ORG.ORG_NAME%TYPE,
  5     C2 SF_ORG.PARENT_ID%TYPE
  6    );
  7    TYPE T_TYPE IS TABLE OF TEST_EMP;
  8    V_TYPE  T_TYPE;
  9  BEGIN
 10     SELECT ORG_NAME,  PARENT_ID BULK COLLECT INTO V_TYPE
 11     FROM SF_ORG
 12     WHERE SF_ORG.ORG_ID <= 3;
 13 
 14     FOR V_INDEX IN V_TYPE.FIRST .. V_TYPE.LAST LOOP
 15         DBMS_OUTPUT.PUT_LINE(V_TYPE(V_INDEX).C1 || ‘ ‘ || V_TYPE(V_INDEX).C2);
 16     END LOOP;
 17  END;















Oracle存儲過程自定義數組定義與使用

最近為公司項目數據庫通過存儲過程做歸檔,需要用到自定義數組

百度結果中很多寫的都不是很清晰,可變長數組定義好後,如何使用。

在此做個記錄:

定義:

type id_array is table of number(15) index by binary_integer;

acb_ids id_array;

這個定義方式適用在package,如果是純粹在存儲過程中自定義類型請百度 。

使用:

acb_ids(acb_ids.count+1) := c_account_books_cbs_rec.acb_id;

網上很多實例是這樣的:acb_ids(acb_ids.count) := c_account_books_cbs_rec.acb_id;這樣寫是沒有用的,因為這個時候acb_ids是空的,那麽acb_ids.count也是無效的,acb_ids在使用時回會報"未找到任何數據",因此需要acb_ids.count+1。

c_account_books_cbs_rec為遊標遍歷中的一個對象,上述代碼意思是將遊標數據中每行記錄的ID放到自定義數組中,方便存儲過程的值返回或者遊標遍歷外程序體中使用。

for x in 1 .. acb_ids.count loop
do something;
end loop;



存儲過程中定義參數類型為數組

註意:本文來源:《存儲過程中定義參數類型為數組

1:存儲過程

  1 Procedure Update_Batch_Id(p_entity_id in Number,
  2                             p_vdr_id    In fnd_table_of_number) is
  3   begin
  4 
  5     For i In 1 .. p_vdr_id.COUNT Loop
  6       update cux_table_header cvs
  7          set cvs.attribute10 = p_entity_id
  8        where cvs.header_id = p_vdr_id(i);
  9     End Loop;
 10   end;

2:JAVA中調用

  1 List list = new ArrayList();
  2 ...
  3 list.add(row.getHeaderId());
  4 ...
  5 
  6 
  7  OracleCallableStatement statement = null;
  8         OracleConnection oracleConnection = (OracleConnection)tsn.getJdbcConnection();
  9 int size = list.size();
 10 if (size>0)
 11         {
 12            Number[] vdrIdArray = (Number[])list.toArray(new Number[size]);
 13             ARRAY vdrArray=null;
 14 try {
 15                           ArrayDescriptor tableOfNumber =
 16                               oracle.sql.ArrayDescriptor.createDescriptor("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                        statement.execute();
 26                       }catch (Exception ex) {
 27                                String[][] stra2 = { { "123456wewee", ex.getMessage() }, };
 28                                LogUtil.of(stra2, this).print(pageContext);
 29                             ex.printStackTrace();
 30                             System.out.println(ex.getMessage());
 31                            }
 32 }


























——————————————————————————————————————————————————————————————————————————————————————————

數組 類型 在 存儲過程中 使用