谷本 心 in せろ部屋

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

戻り値がStructのストアドプロシージャ

まずはS2Dao云々は置いといて、戻り値がStructのストアドプロシージャの扱い方を考える。
Oracleオブジェクト型の操作を参考に、以下のような定義を作成する。

CREATE TYPE PERSON AS object
(
  ID NUMBER(5),
  NAME VARCHAR2(30)
)
/ 

CREATE OR REPLACE FUNCTION "NEW_PERSON"
(
  ID in NUMBER,
  NAME in VARCHAR2
)
return PERSON
is
begin
  return PERSON(ID, NAME);
end;
/


これに対応したJavaのソースは、以下の通り。

package examples.dao;

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 StoredTypeReturnClient {
	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(?, ?)}");

		stmt.registerOutParameter(1, Types.STRUCT, "PERSON");
		stmt.setInt(2, 1000);
		stmt.setString(3, "USER1");

		stmt.execute();

		Object o = stmt.getObject(1);

		Struct struct = (Struct) o;
		Object[] attrs = struct.getAttributes();

		System.out.println(attrs[0]);
		System.out.println(attrs[1]);
	}
}

これで、戻り値が正しく取れました。
これだけなら、Oracleドライバへの依存は不要で、
後は、Struct → Dtoマッピングを行なえば良いだけ。


これぐらいなら、簡単なんだけどなー。