Oracle 10とJDBC:比較時にCHARに後続のスペースを無視させる方法は?

StackOverflow https://stackoverflow.com/questions/603245

  •  03-07-2019
  •  | 
  •  

質問

次のクエリがあります

  

... WHERE PRT_STATUS = 'ONT' ...

ただし、prt_statusフィールドはCHAR(5)として定義されています。そのため、常にスペースが埋め込まれます。クエリは結果として何にも一致しません。このクエリを機能させるには、

  

... WHERE rtrim(PRT_STATUS)= 'ONT'

これは動作します。

それは迷惑です。

同時に、いくつかのpure-java DBMSクライアント(Oracle SQLDeveloperおよびAquaStudio)では、最初のクエリに問題はありません。正しい結果が返されます。 TOADにも問題はありません。

単に接続を何らかの互換モード(ANSIなど)にすると仮定するので、OracleはCHAR(5)が末尾の文字に関係なく比較されることを期待していることを知っています。

アプリケーションで取得したConnectionオブジェクトを使用してどうすればよいですか?

更新データベーススキーマを変更できません。

解決策これは、Oracleがフィールドとパラメータで渡されたものを比較する方法でした。

バインドが完了すると、文字列はPreparedStatement.setString()を介して渡され、typeがVARCHARに設定されるため、Oracleは埋め込みなしの比較を使用し、失敗します。

setObject(n、str、Types.CHAR)を使用しようとしました。失敗します。逆コンパイルでは、OracleがCHARを無視し、VARCHARとして再び渡すことが示されています。

最終的に機能するバリアントは

です
setObject(n,str,OracleTypes.FIXED_CHAR);

ただし、コードは移植できません。

UIクライアントは別の理由で成功します-バインドではなく文字リテラルを使用します。 PRT_STATUS = 'ONT'と入力すると、 'ONT'はリテラルであるため、埋め込み方法を使用して比較されます。

役に立ちましたか?

解決

Oracleはを比較します。空白が埋め込まれた比較セマンティクスを使用したCHAR 値。

データ型比較ルールから

  

Oracleは空白埋め比較を使用します   両方の値が   比較は   データ型CHAR、NCHAR、テキストリテラル、   またはUSERによって返された値   関数。

あなたの例では、 'ONT' はバインドパラメータとして渡されますか、それとも説明したようにテキストでクエリに組み込まれますか?バインドパラメータの場合は、 CHAR 型としてバインドされていることを確認してください。それ以外の場合、使用されているクライアントライブラリのバージョンを確認してください。Oracleの実際の古いバージョン(v6など)では、 CHAR の比較セマンティクスが異なります。

他のヒント

データベーステーブルを変更できない場合は、クエリを変更できます。

RTRIMの代替案:

  

.. WHERE PRT_STATUS like 'ONT%' ...

     

.. WHERE PRT_STATUS = 'ONT' ...-Tの後ろの2つの空白      

.. WHERE PRT_STATUS = rpad( 'ONT'、5、 '')...

dbのCHAR(5)列をvarchar2(5)に変更します。

クエリでcharへのキャスト操作を使用できます:

... WHERE PRT_STATUS=cast('ONT' as char(5))

またはより一般的なJDBCの方法:

... WHERE PRT_STATUS=cast(? as char(5))

そして、JDBCコードで statement.setString(1、" ONT");

を使用します
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top