bạn phải xác định một đối tượng sqldata để ánh xạ điều này.
tài liệu: http://docs.oracle.com /cd/E11882_01/java.112/e16548/oraarr.htm#JJDBC28574
ví dụ:
SQL> create or replace TYPE tableOneExample AS OBJECT (
2 somethingOne VARCHAR2 (4)
3 ,somethingTwo NUMBER (12)
4 );
5 /
Type created.
SQL> create or replace TYPE outputOneSQLType IS TABLE OF tableOneExample;
2 /
Type created.
SQL>
SQL> create or replace PROCEDURE myprocedure (
2 inputParam IN VARCHAR2,
3 outputOne OUT outputOneSQLType)
4 as
5 begin
6 outputOne := outputOneSQLType(tableOneExample('a', 1), tableOneExample('b', 2));
7 end;
8 /
Procedure created.
bây giờ chúng tôi xác định giao diện SQLDATA:
import java.sql.*;
public class TestArr implements SQLData
{
private String sql_type;
public String attrOne;
public int attrTwo;
public TestArr()
{
}
public TestArr (String sql_type, String attrOne, int attrTwo)
{
this.sql_type = sql_type;
this.attrOne = attrOne;
this.attrTwo = attrTwo;
}
// define a get method to return the SQL type of the object
public String getSQLTypeName() throws SQLException
{
return sql_type;
}
// define the required readSQL() method
public void readSQL(SQLInput stream, String typeName)
throws SQLException
{
sql_type = typeName;
attrOne = stream.readString();
attrTwo = stream.readInt();
}
// define the required writeSQL() method
public void writeSQL(SQLOutput stream)
throws SQLException
{
stream.writeString(attrOne);
stream.writeInt(attrTwo);
}
}
đảm bảo các đầu vào và thứ tự của luồng ghi / đọc giống với kiểu oracle của bạn, vì bất kỳ sự mâu thuẫn nào sẽ gây ra lỗi đại diện nội bộ.
sau đó trong lớp chính, bạn sẽ ánh xạ điều này như sau:
CallableStatement stmt = conn.prepareCall("begin myprocedure(?,?); end;");
stmt.setString(1, "foo");
stmt.registerOutParameter(2, java.sql.Types.ARRAY, "OUTPUTONESQLTYPE"); // YOUR ARRAY TYPE (TO MATCH THE API OUTPUT), NOT OBJECT
stmt.execute();
Array arr = stmt.getArray (2);
Map map = conn.getTypeMap();
map.put("TABLEONEEXAMPLE", Class.forName("TestArr")); // YOUR OBJECT TYPE, NOT ARRAY.
Object[] values = (Object[]) arr.getArray();
for (int i=0; i < values.length; i++)
{
TestArr a = (TestArr)values[i];
System.out.println("somethingOne: " + a.attrOne);
System.out.println("somethingTwo: " + a.attrTwo);
}
bieng kết quả:
M:\Documents\Sample Code\1>javac TestArr.java
M:\Documents\Sample Code\1>javac ArrayTest.java
Note: ArrayTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
M:\Documents\Sample Code\SQLComplexArray>java ArrayTest
Opening Oracle connection...done.
somethingOne: a
somethingTwo: 1
somethingOne: b
somethingTwo: 2