有关如何在 java中绑定 SQL 对象的 SQL 嵌套表的示例,请参阅 SO 问题“如何在 java 中调用包含用户定义类型的 oracle 存储过程? ”。这里的 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