QA@IT
«回答へ戻る

回答を投稿

zillollさん返信ありがとうございます^^。

引数で渡されているStringの配列にはデータが入っているでしょうか。

これは値は入っています。

メソッド内で初期化した配列を渡しても、入らないですか?

※とりあえず確実にデータのある配列を渡した場合の確認

引数で渡してある配列でも、メソッド内で初期化した配列でも、入りませんでした。
もうちょっと調べてみたところ、

// ステートメントを作成
cstmt = con.prepareCall(sql);

の所のcstmt= T4CCallableStatement (ID=84)の中で、
errMsgMixedBind= "Ordinal binding and Named binding cannot be combined!"
と出ていました。

// Oracleの配列(コレクション型(VARRAY型))への定義変数作成
ArrayDescriptor strDesc = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", con);

と、

// Oracle配列の作成
ARRAY arrData = new ARRAY(strDesc, con, DataArray);

の所で、値が入っていないみたいです。
ストアドに値が渡されていないのは確認しました。

PL/SQLの確認は、以下の内容のスクリプトファイルをSQL*Plusで実行してみる

のはどうでしょうか。

実行してみたところ、正常にどちらの値もINSERTされました。
やはり、ストアド側に値がうまく渡っていないようです。

JDBCのドライバはthinドライバの最新を入れました。

あと、ちょっと気になったのですが、呼び出し側でトランザクションの

制御をするのであれば、PL/SQLのFunctionでは、

commit/rollbackしないようがよいように思います。

これはミスでした。直しておきます。

投稿者:satoko

zillollさん返信ありがとうございます^^。


> 引数で渡されているStringの配列にはデータが入っているでしょうか。

> 


これは値は入っています。


> メソッド内で初期化した配列を渡しても、入らないですか? 

> ※とりあえず確実にデータのある配列を渡した場合の確認 

> 


引数で渡してある配列でも、メソッド内で初期化した配列でも、入りませんでした。
もうちょっと調べてみたところ、

// ステートメントを作成
cstmt = con.prepareCall(sql);

の所のcstmt= T4CCallableStatement  (ID=84)の中で、
errMsgMixedBind= "Ordinal binding and Named binding cannot be combined!"
と出ていました。

// Oracleの配列(コレクション型(VARRAY型))への定義変数作成
ArrayDescriptor strDesc = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", con);

と、

// Oracle配列の作成
ARRAY arrData = new ARRAY(strDesc, con, DataArray);

の所で、値が入っていないみたいです。
ストアドに値が渡されていないのは確認しました。


> PL/SQLの確認は、以下の内容のスクリプトファイルをSQL*Plusで実行してみる 

> のはどうでしょうか。 

> 


実行してみたところ、正常にどちらの値もINSERTされました。
やはり、ストアド側に値がうまく渡っていないようです。

JDBCのドライバはthinドライバの最新を入れました。


> あと、ちょっと気になったのですが、呼び出し側でトランザクションの 

> 制御をするのであれば、PL/SQLのFunctionでは、 

> commit/rollbackしないようがよいように思います。

> 


これはミスでした。直しておきます。


投稿者:satoko