Oracle
ストアドプロシージャの戻り値をDtoで返すためには、 戻り値とDTOのマッピング STRUCTとDTOのマッピング の2段階が必要。 似たような処理をしているのが BeanMetaDataとか、AbstractBeanMetaDataResultSetHandlerとなので、 この辺りを参考にして作れそう。 …
ラッパーを作ることで、引数のDTO(STRUCT)、配列(ARRAY)には対応ができた。 次は、戻り値の変換をどうするか。 ストアドプロシージャのreturnやOUTパラメータにSTRUCTやARRAYが入っていると、 Daoの戻り値にも、oracle.sql.STRUCT型や、oracle.sql.ARRAY型の…
S2Daoのストアド呼び出しの引数に、STRUCTやARRAYを使えるようにする改修。 ストアドプロシージャの引数がSTRUCT Dao側のメソッドは、引数をDtoにする ストアドプロシージャの引数がARRAY Dao側のメソッドは、引数をListか配列にする 、、、を実現するための…
こんなコードを書くと、 StructDescriptor sd = new StructDescriptor("PERSON", conn); OracleTypeADT adt = sd.getOracleTypeADT(); int attrNum = adt.getNumAttrs(); for (int i = 1; i <= attrNum; i++) { String name = adt.getAttributeName(i); Syst…
上のテーブルをよく見れば分かるけど(誰も見ないって!)、 引数や戻り値に配列が使われている所は、 全部「VARRAY」になっていて、その次の行に、配列の型が書いてある。 DatabaseMetaDataでは、、、 VARRAYの型名は取れない VARRAYがどの型で構成されてい…
昨日のエントリーで、ちょっと嘘ついちゃいました。 ユーザ定義の詳細は、DatabasetMetaDataの別メソッドを使えば、 もうちょっと取れます。 ということで、 DatabaseMetaDataでどんな情報が取れるか見ていこう。 こんなコードを書いてみる。 public class D…
引数のSTRUCT ORADataのラッパーを使って、DTOをラッピングして渡す。 StructDescriptorを利用する。 戻り値のSTRUCT StructをDtoに変換して返す。 DTOのクラス名の取り方は? 引数のARRAY ORADataのラッパーを使って、ラッピングして渡す。 ArrayDescriptor…
ということで、自前でOracleのディクショナリから値を取るSQL文。 SELECT * FROM all_arguments WHERE object_name LIKE 'NEW_PERSON' ORDER BY owner, package_name, overload, sequence ;この戻り値を、Javaのロジックで整理してやれば、必要な定義は全部…
昨日のエントリーに書いたようなストアドプロシージャを、 S2DaoのPROCEDUREアノテーションを使って呼び出すと、 どういう問題が発生するのか? こんなDaoを書いてアクセスしてみる。 package examples.dao; import java.util.Map; public interface StoredT…
本日最後、引数がArrayのストアドプロシージャ。 これがちょっと面倒くさい。 まずはストアドプロシージャ定義から。 配列で渡されたPersonの名前を結合するだけ。 CREATE OR REPLACE FUNCTION "PERSON_NAME_MERGE" ( USERS in PERSON_ARRAY ) return VARCHA…
次は、戻り値がArrayのストアドプロシージャ。 やはり公式ドキュメントのOracleコレクションの操作が参考になります。 定義したプロシージャの詳細は省略、気になる人はソースを読んで! CREATE TYPE PERSON_ARRAY AS VARRAY(10) OF PERSON / CREATE OR REPL…
続いて、引数がStructのストアドプロシージャの扱い方を考える。 PERSON型を渡して、PERSON.NAMEを返すようなプロシージャを定義する。 CREATE OR REPLACE FUNCTION "PERSON_NAME" ( USER in PERSON ) return VARCHAR2 is begin return USER.NAME; end; / こ…
まずはS2Dao云々は置いといて、戻り値がStructのストアドプロシージャの扱い方を考える。 Oracleオブジェクト型の操作を参考に、以下のような定義を作成する。 CREATE TYPE PERSON AS object ( ID NUMBER(5), NAME VARCHAR2(30) ) / CREATE OR REPLACE FUNCT…
s2dao-oracleを作成するにあたって、まずは目的を明確にしよう。 ストアドプロシージャ(procedure / function)経由で、ユーザ定義型、ユーザ定義配列を扱えるようにする。 DtoとStruct(java.sql.Struct / oracle.sql.STRUCT)のマッピングを自動的に行なう。 …