戻り値がArrayのストアドプロシージャ
次は、戻り値が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配列が取得できます。