开发者

Calling Sql procedure from Spring DAO

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

Now when calling the procedure

    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;

i can make use of arraydescriptor to pass parent array ACCOUNT_OBJ_ARRAY ,but how to pa开发者_Python百科ss array inside it (the array of new address objects) from Spring procedure call?


See the SO question "How to call oracle stored procedure which include user-defined type in java?" for an example of how to bind a SQL nested table of SQL object in java. Here the SQL object also itself contains a nested table of object. The method is similar (SQL arrays are bound by ARRAY Object in java, SQL objects are bound by 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

I will show a demo using the 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

Now we call the java procedure:

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜