2011-01-18 6 views
0
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 

Теперь при вызове процедурыВызов Sql процедуры с весны DAO

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

См. Вопрос SO «How to call oracle stored procedure which include user-defined type in java?» на примере того, как связать SQL-вложенную таблицу объекта SQL в java. Здесь сам объект SQL также содержит вложенную таблицу объекта. Метод аналогичен (массивы SQL привязаны объектом ARRAY в java, объекты 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