數組 類型 在 存儲過程中 使用
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)); 10end 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 9loop 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復合數據類型。在使用記錄數據類型變量時,需要在聲明部分先定義記錄的組成、記錄的變量,然後在執行部分引用該記錄變量本身或其中的成員。
定義記錄數據類型的語法如下:
1TYPE 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]); 81.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 }
——————————————————————————————————————————————————————————————————————————————————————————
數組 類型 在 存儲過程中 使用