【问题标题】:Calling Sql procedure from Spring DAO从 Spring DAO 调用 Sql 过程
【发布时间】:2011-01-18 18:02:28
【问题描述】:
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过程调用中传递其中的数组(新地址对象的数组)?

【问题讨论】:

    标签: java oracle spring plsql procedure


    【解决方案1】:

    有关如何在 java 中绑定 SQL 对象的 SQL 嵌套表的示例,请参见 SO 问题“How to call oracle stored procedure which include user-defined type in java?”。这里的 SQL 对象本身也包含一个嵌套的对象表。方法类似(java中SQL数组由ARRAY对象绑定,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
    

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      相关资源
      最近更新 更多