2017-01-09 13 views
1

jdbcインタフェースからOracleストアドプロシージャを呼び出す必要があります。javaからplsqlへの単一文字列varchar2(1)により '文字列バッファが小さすぎます'

TYPE cust_account_rec_type IS RECORD (
    ... , status VARCHAR2(1), ...); 

マイJDBCクエリ文字列は、レコード型変数を宣言し、右側は、クエリパラメータであるステータスフィールドに値を代入:手順はVARCHAR(2)フィールドを含むレコードタイプパラメータを取ります。その後、プロシージャを呼び出します。私はこの単一文字のvarchar型に整列する

ORA-06502: PL/SQL: numeric or value error: character string buffer too small 

メッセージ・ポイントを得た)callableStatement.execute(後

callableStatement.setString("IN_insert_status", "I"); 
// callableStatement is type of java.sql.CallableStatement 

p_cust_account_rec.status := :IN_insert_status; 

someprocedure(p_cust_account_rec); 

のJavaクエリ呼び出しがIN_insert_statusパラメータの値を設定します変数。しかし、ハードコード値がSQLクエリ文字列の場合:

p_cust_account_rec.status := 'I'; 

となります。

Javaで単一文字列を渡すときに何が問題になるのですか?何が欠けていますか?

+0

データベースを変更することは禁止されています。それは外部データベースであり、その観点からは、私にとっては「読み取り専用」です。 – Invader92

+0

ここを見て、同じ問題かもしれない、http://stackoverflow.com/questions/17598969/character-string-buffer-too-small-error-in-oracle-stored-procedure –

答えて

0

私は解決策を持っています。実際、問題は他のところにあります。 oracle jdbcドライバを使用して、SQLで表示された順序と同じ順序でクエリパラメータ値を(Javaで)設定することが期待されています。理想化された。

だから、私は

p_cust_account_rec.account_name  := :IN_account_name; -- VARCHAR2(240) 
p_cust_account_rec.status   := :IN_insert_status; -- VARCHAR2(1) 

などの照会フラグメントを持っていたとJavaは、(重要な順)

callableStatement.setString("IN_insert_status", "I"); 
callableStatement.setString("IN_account_name", "Some Account Name"); 

のように呼び出し、それが= "I" IN_account_nameで終わった、とIN_insert_statis =「いくつかのアカウント名"これは、insert_status VARCHAR2(1)の性質のために '文字バッファー・サイズ・エラー'を引き起こしました。

oracle jdbcのためにこれを100%確認できません。原因はデコンパイルされたコードだけですが、問題はhttp://info.michael-simons.eu/2012/07/23/oracle-jbdc-callablestatements-and-named-parameters/とも言われています。しかし、それは私の問題を解決しました。

関連する問題