QA@IT
«回答へ戻る

回答を投稿

同じ環境じゃないので恐縮ですが、
9i環境で、クライアントマシンの上でのコマンドラインからのJava実行(JDK1.3)では、
問題なく動きますね。
コードは間違っていないように思います。
引数で渡されているStringの配列にはデータが入っているでしょうか。

因みにPL/SQL部分は、まんまコピッて登録して、
Javaの実行コードは以下のようにデータ配列をメソッド内で作っている以外は
まんまコピーです。
------------------------------------------------------
int[] AbsArray = {0,1,2};
String[] DataArray = {"一件目","二件目","三件目"};
ArrayDescriptor strDesc = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", con);
ArrayDescriptor intDesc = ArrayDescriptor.createDescriptor("NUMBER_ARRAY", con);
// Oracle配列の作成
ARRAY arrAbs = new ARRAY(intDesc, con, AbsArray);
ARRAY arrData = new ARRAY(strDesc, con, DataArray);
// SQL文(ストアドファンクション実行文)の作成
String sql = "BEGIN ? := TEST_BIND_INSERT(?, ?); END;";
// ステートメントを作成
cstmt = con.prepareCall(sql);
// パラメータの設定
cstmt.registerOutParameter(1, Types.VARCHAR);
((OracleCallableStatement)cstmt).setARRAY(2, arrAbs);
((OracleCallableStatement)cstmt).setARRAY(3, arrData);

cstmt.execute() ;
-------------------------------------------------------

メソッド内で初期化した配列を渡しても、入らないですか?
※とりあえず確実にデータのある配列を渡した場合の確認
原因がJDBCドライバの問題とかだとおてあげですが・・・

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

--------------------------------------------------------

set serveroutput on

declare
num_table NUMBER_ARRAY;
v2_table VARCHAR2_ARRAY;

result NUMBER;

CURSOR cur IS
SELECT ID, TYPE
FROM T_CST_TEST;

begin
num_table := NUMBER_ARRAY(0,1,2);
v2_table := VARCHAR2_ARRAY('一件目', '二件目', '三件目');

result := TEST_BIND_INSERT(num_table, v2_table);

FOR rCur IN cur
LOOP
    dbms_output.put_line('[ID]=[' || rCur.ID || '][TYPE]=[' || rCur.TYPE || ']');
END LOOP;

commit work;

exception
when others then
dbms_output.put_line(sqlerrm);
rollback work;
end;
/

--------------------------------------------------------

あと、ちょっと気になったのですが、呼び出し側でトランザクションの
制御をするのであれば、PL/SQLのFunctionでは、
commit/rollbackしないようがよいように思います。

[ メッセージ編集済み 編集者: zilloll 編集日時 2007-05-09 20:46 ]

投稿者:zilloll

同じ環境じゃないので恐縮ですが、
9i環境で、クライアントマシンの上でのコマンドラインからのJava実行(JDK1.3)では、
問題なく動きますね。
コードは間違っていないように思います。
引数で渡されているStringの配列にはデータが入っているでしょうか。

因みにPL/SQL部分は、まんまコピッて登録して、
Javaの実行コードは以下のようにデータ配列をメソッド内で作っている以外は
まんまコピーです。
\------------------------------------------------------
int[] AbsArray = {0,1,2};
String[] DataArray = {"一件目","二件目","三件目"};
ArrayDescriptor strDesc = ArrayDescriptor.createDescriptor("VARCHAR2_ARRAY", con);
ArrayDescriptor intDesc = ArrayDescriptor.createDescriptor("NUMBER_ARRAY", con);
// Oracle配列の作成
ARRAY arrAbs = new ARRAY(intDesc, con, AbsArray);
ARRAY arrData = new ARRAY(strDesc, con, DataArray);
// SQL文(ストアドファンクション実行文)の作成
String sql = "BEGIN ? := TEST_BIND_INSERT(?, ?); END;";
// ステートメントを作成
cstmt = con.prepareCall(sql);
// パラメータの設定
cstmt.registerOutParameter(1, Types.VARCHAR);
((OracleCallableStatement)cstmt).setARRAY(2, arrAbs);
((OracleCallableStatement)cstmt).setARRAY(3, arrData);

cstmt.execute() ;
\-------------------------------------------------------

メソッド内で初期化した配列を渡しても、入らないですか?
※とりあえず確実にデータのある配列を渡した場合の確認
原因がJDBCドライバの問題とかだとおてあげですが・・・

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

\--------------------------------------------------------

set serveroutput on

declare
	num_table	NUMBER_ARRAY;
	v2_table	VARCHAR2_ARRAY;

	result NUMBER;

	CURSOR cur IS
	SELECT ID, TYPE
	FROM T_CST_TEST;
begin
	num_table := NUMBER_ARRAY(0,1,2);
	v2_table := VARCHAR2_ARRAY('一件目', '二件目', '三件目');

	result := TEST_BIND_INSERT(num_table, v2_table);

	FOR rCur IN cur
	LOOP
		dbms_output.put_line('[ID]=[' || rCur.ID || '][TYPE]=[' || rCur.TYPE || ']');
	END LOOP;

	commit work;
exception
	when others then
		dbms_output.put_line(sqlerrm);
		rollback work;
end;
/

\--------------------------------------------------------

あと、ちょっと気になったのですが、呼び出し側でトランザクションの
制御をするのであれば、PL/SQLのFunctionでは、
commit/rollbackしないようがよいように思います。


<font size="-1">[ メッセージ編集済み 編集者: zilloll 編集日時 2007-05-09 20:46 ]</font>


投稿者:zilloll