Chiamata procedure SQL da Spring DAO
Domanda
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
Ora, quando si chiama la procedura
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 può fare uso di arraydescriptor passare genitore gamma ACCOUNT_OBJ_ARRAY, ma come passare la matrice al suo interno (la serie di nuovi oggetti di indirizzo) da chiamata di procedura primavera?
Soluzione
Vedere la domanda SO " Come chiamare stored procedure Oracle che includono tipo definito dall'utente in java? " per un esempio di come associare uno SQL tabella nidificata dell'oggetto SQL in Java. Qui l'oggetto SQL anche se contiene una tabella nidificata di oggetto. Il metodo è simile (array SQL sono vincolati da ARRAY oggetto in Java, oggetti SQL sono vincolati 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 mostrerà una demo utilizzando l'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
Ora che noi chiamiamo la procedura di 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow