谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

戻り値が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配列が取得できます。


これまた、戻り値を扱うだけなら、
OracleJDBCドライバには依存せずに作れます。