CREATE OR REPLACE TYPE NEW_ADDRS_OBJ
AS OBJECT (newAddress1 varchar2(20),
newAddress2 varchar2(20),
city varchar2(20),
state varchar2(20),
zip number(20))
create or replace type NEW_ADDRS_OBJ_ARRAY as table of NEW_ADDRS_OBJ
CREATE OR REPLACE TYPE ACCOUNT_OBJ
AS OBJECT (fname varchar2(20),
newAddress NEW_ADDRS_OBJ_ARRAY)
create or replace type ACCOUNT_OBJ_ARRAY as table of ACCOUNT_OBJ
现在调用程序
CREATE OR REPLACE PROCEDURE INSERT_NEW_ADDRESS ( account_array in ACCOUNT_OBJ_ARRAY ) AS
tempaddres NEW_ADDRS_OBJ_ARRAY;
begin
for i in 1..account_array.count loop
tempaddres := NEW_ADDRS_OBJ_ARRAY();
tempaddres := account_array(i).newAddress;
for j in 1..tempaddres.count loop
insert into TEST_ACCOUNT (ACCOUNT,NEWADDRESS1 ,NEWADDRESS2 ,CITY ,STATE ,ZIP )
values(account_array(i).fname,
tempaddres(j).newAddress1,
tempaddres(j).newAddress2,
tempaddres(j).city,
tempaddres(j).state,
tempaddres(j).zip);
end loop;
end loop;
end;
我可以使用arraydescriptor来传递父数组ACCOUNT_OBJ_ARRAY,但是如何从Spring过程调用中传递数组(新地址对象的数组)?
答案 0 :(得分:0)
有关如何在java中绑定SQL对象的SQL嵌套表的示例,请参阅SO问题“How to call oracle stored procedure which include user-defined type in java?”。这里SQL对象本身也包含一个嵌套的对象表。方法类似(SQL数组在java中由ARRAY Object绑定,SQL对象由STRUCT绑定)。
SQL> CREATE OR REPLACE PROCEDURE insert_new_address (
2 account_array IN ACCOUNT_OBJ_ARRAY
3 ) AS
4 tempaddres NEW_ADDRS_OBJ_ARRAY;
5 BEGIN
6 FOR i IN 1 .. account_array.COUNT LOOP
7 FOR j IN 1 .. account_array(i).newAddress.COUNT LOOP
8 dbms_output.put_line(
9 account_array(i).fname || ', ' ||
10 account_array(i).newAddress(j).newAddress1 || ', ' ||
11 account_array(i).newAddress(j).newAddress2 || ', ' ||
12 account_array(i).newAddress(j).city || ', ' ||
13 account_array(i).newAddress(j).state || ', ' ||
14 account_array(i).newAddress(j).zip);
15 END LOOP;
16 END LOOP;
17 END;
18 /
Procedure created
我将使用Oracle java jvm显示演示:
SQL> CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "ArrayDemo"
2 as
3
4 import java.io.*;
5 import java.sql.*;
6 import oracle.sql.*;
7 import oracle.jdbc.driver.*;
8
9 public class ArrayDemo {
10
11 public static void passArray() throws SQLException {
12
13 Connection conn = new OracleDriver().defaultConnection();
14
15 /*creation of NEW_ADDRS_OBJ*/
16 StructDescriptor addrObjDescriptor =
17 StructDescriptor.createDescriptor("NEW_ADDRS_OBJ",conn);
18 Object[] addrAtributes = new Object[] {new String("address1"),
19 new String("address2"),
20 new String("city"),
21 new String("state"),
22 new Integer(12345)};
23
24 /*creation of NEW_ADDRS_OBJ_ARRAY*/
25 ArrayDescriptor addrTabDescriptor =
26 ArrayDescriptor.createDescriptor( "NEW_ADDRS_OBJ_ARRAY", conn );
27 STRUCT addr1 = new STRUCT(addrObjDescriptor,conn,addrAtributes);
28 STRUCT[] adrStructArray = {addr1};
29 ARRAY arrayAddr = new ARRAY(addrTabDescriptor,conn,adrStructArray);
30
31 /*creation of ACCOUNT_OBJ*/
32 StructDescriptor acctObjDescriptor =
33 StructDescriptor.createDescriptor("ACCOUNT_OBJ",conn);
34 Object[] acctAttributes = new Object[] {new String("AcctName"),
35 arrayAddr};
36
37 /*creation of ACCOUNT_OBJ_ARRAY*/
38 ArrayDescriptor acctTabDescriptor =
39 ArrayDescriptor.createDescriptor( "ACCOUNT_OBJ_ARRAY", conn );
40 STRUCT acct1 = new STRUCT(acctObjDescriptor,conn,acctAttributes);
41 STRUCT[] acctStructArray = {acct1};
42 ARRAY acctArray = new ARRAY(acctTabDescriptor,conn,acctStructArray);
43
44 /* statement */
45 OraclePreparedStatement ps =
46 (OraclePreparedStatement)conn.prepareStatement
47 ("begin insert_new_address(:x); end;" );
48
49 ps.setARRAY( 1, acctArray );
50 ps.execute();
51
52 }
53 }
54 /
Java created
现在我们调用java过程:
SQL> CREATE OR REPLACE
2 PROCEDURE show_java_calling_plsql
3 AS LANGUAGE JAVA
4 NAME 'ArrayDemo.passArray()';
5 /
Procedure created
SQL> exec show_java_calling_plsql
AcctName, address1, address2, city, state, 12345
PL/SQL procedure successfully completed