戻り値が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のマッピングを行なえば良いだけ。
これぐらいなら、簡単なんだけどなー。