數組做為參數傳入Oracle存儲過程操作數據庫


數組里存儲的是Stringintlang等基本數據類型或引用數據類型(不包括java bean


一、在oracle中定義一個數組類型(TYPE

代碼如下:

createorreplacetype msg_array astableofnumber;

意思是創建一個名稱為msg_array,存放類型為整型的數組類型

二、在oracle中定義一個存儲過程

代碼如下:

createorreplaceprocedure modifyage(m_array in msg_array)

as

begin

for i in1..m_array.count loop

update users set age=age+1where id=m_array(i);

endloop;

commit;

exception

whenothersthen

rollback;

end modifyage;

創建一個存儲過程,傳入的參數是上面定義的msg_array類型,操作內容為循環傳入的數組,對表的age字段做加1操作。

三、JAVA代碼如下

Connection conn = null;

CallableStatement cstmt = null;

try {

Class.forName("oracle.jdbc.OracleDriver");

conn = DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:orcl", "orcl_dev",

"dev");

List list = new ArrayList();

list.add(30);

list.add(31);

list.add(32);

list.add(33);

ArrayDescriptor tabDesc = ArrayDescriptor.createDescriptor(

"MSG_ARRAY", conn);

ARRAY vArray = new ARRAY(tabDesc, conn, list.toArray());

cstmt = conn.prepareCall("call modifyage(?)");

cstmt.setArray(1, vArray);

cstmt.execute();

cstmt.close();

conn.close();

} catch (Exception e) {

e.printStackTrace();

}

首先定義ConnectionCallableStatement2個變量,然后通過JDBC的方式得到Connection,然后定義要傳給存儲過程的數組。

映射 Oracle端數組 AS TABLE OF類型

通過ArrayDescriptor.createDescriptor("MSG_ARRAY",conn)定義數組描述方式。

在通過new ARRAY(tabDesc, conn, list.toArray()),把要傳入的數組按批定的數組描述方式生成一個新的Oracle定義的數組。

調用存儲過程,傳入參數並執行。


數組里存儲的是java bean


一、在oracle中定義一個對象類型(OBJECT

createorreplacetype userobj asobject(

id number,

username nvarchar2(20),

age number,

password nvarchar2(20)

)

意思是創建一個名稱為userobj的對象類型,字符串的類型一定要寫成nvarchar2,否則,傳入數據庫的字符串為null

二、在oracle中定義一個數組類型(TYPE

代碼如下:

createorreplacetype obj_array astableof userobj;

意思是創建一個名稱為obj_array,存放類型為userobj的數組類型

三、在oracle中定義一個存儲過程

代碼如下:

createorreplaceprocedure saveObjArray

(

avc_objArray in obj_array,

rowcountoutnumber,

msg outvarchar2

)as

userinfo userobj;

begin

for i in avc_objArray.First()..avc_objArray.Last()loop

userinfo := avc_objArray(i);

insertinto users (id,name,password,age)

values(userinfo.id,userinfo.username,userinfo.password,userinfo.age);

endloop;

rowcount:=sql%rowcount;

commit;

exception

whenothersthen

rowcount:=0;

msg :=sqlerrm;

rollback;

end saveObjArray;

創建一個存儲過程,傳入的參數是上面定義的obj_array類型的數組,循環數組,分別插入數據庫。返回受影響的行數和提式信息。

四、JAVA代碼如下

Connection conn = null;

CallableStatement cstmt = null;

try{

Class.forName("oracle.jdbc.OracleDriver");

conn = DriverManager.getConnection(

"jdbc:oracle:thin:@localhost:1521:orcl", "orcl_dev",

"dev");

List<User> userList = new ArrayList<User>();

User user = new User();

user.setId(37);

user.setUsername("dddddd");

user.setPassword("dddddd");

user.setAge(14);

userList.add(user);

StructDescriptor recDesc =

StructDescriptor.createDescriptor("USEROBJ", conn);

ArrayList<STRUCT> pstruct = new ArrayList<STRUCT>();

for(User u : userList){

Object[] objs = new Object[4];

objs[0] = u.getId();

objs[1] = u.getUsername();

objs[2] = u.getAge();

objs[3] = u.getPassword();

STRUCT struct = new STRUCT(recDesc, conn, objs);

pstruct.add(struct);

}

ArrayDescriptor tabDesc =

ArrayDescriptor.createDescriptor("OBJ_ARRAY", conn);

ARRAY vArray = new ARRAY(tabDesc, conn, pstruct.toArray());

cstmt = conn.prepareCall("call saveObjArray(?,?,?)");

cstmt.setArray(1, vArray);

cstmt.registerOutParameter(2, Types.INTEGER);

cstmt.registerOutParameter(3, Types.VARCHAR);

cstmt.execute();

System.out.println(cstmt.getString(2));

System.out.println(cstmt.getString(3));

cstmt.close();

conn.close();

}catch(Exception e){

e.printStackTrace();

}

首先定義ConnectionCallableStatement2個變量,然后通過JDBC的方式得到Connection,然后定義要傳給存儲過程的數組。

映射 Oracle端對象 AS OBJECT類型

首先通過StructDescriptor.createDescriptor("USEROBJ",conn)定義對象描述方式。

然后,把java bean 的各個屬性賦值給Object類型的數組,通過new STRUCT(recDesc, conn, objs)方法,把java bean按照對象描述方式描述成Oracle可以識別的對象。最后放到數組里。

映射 Oracle端數組 AS TABLE OF類型

通過ArrayDescriptor.createDescriptor("OBJ_ARRAY",conn)定義數組描述方式。

在通過new ARRAY(tabDesc, conn, pstruct.toArray()),把要傳入的數組按批定的數組描述方式生成一個新的Oracle定義的數組。

調用存儲過程,傳入參數並執行。


免責聲明!

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



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