次は、戻り値がArrayのストアドプロシージャ。
やはり公式ドキュメントのOracleコレクションの操作が参考になります。
定義したプロシージャの詳細は省略、気になる人はソースを読んで!
CREATE TYPE PERSON_ARRAY AS VARRAY(10) OF PERSON / CREATE OR REPLACE FUNCTION "NEW_PERSON_ARRAY" ( ID1 in NUMBER, NAME1 in VARCHAR2, ID2 in NUMBER, NAME2 in VARCHAR2 ) return PERSON_ARRAY is begin return PERSON_ARRAY(PERSON(ID1, NAME1), PERSON(ID2, NAME2)); end; /
そして、対応したJavaのソースは、以下の通り。
package examples.dao;
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Struct;
import java.sql.Types;
import org.seasar.extension.dbcp.ConnectionPool;
import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;
public class StoredArrayReturnClient {
private static final String PATH = "j2ee.dicon";
public static void main(String[] args) throws Exception {
S2Container container = S2ContainerFactory.create(PATH);
container.init();
ConnectionPool pool = (ConnectionPool) container
.getComponent(ConnectionPool.class);
Connection conn = pool.checkOut();
CallableStatement stmt = conn
.prepareCall("{? = call NEW_PERSON_ARRAY(?, ?, ?, ?)}");
stmt.registerOutParameter(1, Types.ARRAY, "PERSON_ARRAY");
stmt.setInt(2, 1000);
stmt.setString(3, "USER1");
stmt.setInt(4, 2000);
stmt.setString(5, "USER2");
stmt.execute();
Array array = stmt.getArray(1);
Object[] structs = (Object[]) array.getArray();
System.out.println(((Struct) structs[0]).getAttributes()[0]);
System.out.println(((Struct) structs[0]).getAttributes()[1]);
System.out.println(((Struct) structs[1]).getAttributes()[0]);
System.out.println(((Struct) structs[1]).getAttributes()[1]);
}
}なんかちょっとソースが見苦しくなってますが、
getArrayした結果に、もう一度getArrayすると、
中身がStructなObject配列が取得できます。