从Spring DAO调用Sql过程

时间:2011-01-18 18:02:28

标签: java oracle spring plsql procedure

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过程调用中传递数组(新地址对象的数组)?

1 个答案:

答案 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