1

update() メソッドが ORACLE データベースで機能しない理由がわかりません

deleteQuery = "delete from USBRPF where upper(userid) = upper(?)" ;

String s= "ABC " ;
getJdbcTemplate().update(deleteQuery, s.trim());

データ「ABC」を持つ列USERIDの行があります(「C」文字の後にいくつかのスペース文字があります)

その行が見つからないようです。

ただし、コードを以下に変更すると機能します

deleteQuery = "delete from USBRPF where upper(userid) like upper(?)" ;
String s= "ABC " ;
getJdbcTemplate().update(deleteQuery, s.trim() +  "%");

また

deleteQuery = "delete from USBRPF where upper(trim(userid)) = upper(?)" ;
String s= "ABC " ;
getJdbcTemplate().update(deleteQuery, s.trim());

注: ORACLE から移行されたデータを使用して、すべて MSSQL データベースで動作します。データベースの設定に問題があると思います。誰かにそれを理解してもらうことはできますか?ありがとう

変更:

列情報:

オラクル

  BRANCH    CHAR(2 CHAR)          
  COMPANY   CHAR(1 CHAR)         
  DATIME    TIMESTAMP(6)          
  JOBNM CHAR(10 CHAR)          
  UNIQUE_NUMBER NUMBER(18,0)    
  USERID    CHAR(10 CHAR)         
  USRPRF    CHAR(10 CHAR)    

MSSQL

[UNIQUE_NUMBER] [bigint] IDENTITY(1,1) NOT NULL,    
[USERID] [nchar](10) NULL,  
[COMPANY] [nchar](1) NULL,  
[BRANCH] [nchar](2) NULL,   
[USRPRF] [nchar](10) NULL,  
[JOBNM] [nchar](10) NULL,   
[DATIME] [datetime2](6)> NULL,
4

1 に答える 1

1

CHARは固定長タイプです。したがって、データベースでデータが「ABC」のように見えても、「ABC」として保存されます。CHAR列には、サイズが大きいスペースが埋め込まれます

したがって、最初の例では、「ABC」(DBに格納されている)と「ABC」(trim()呼び出しの後にJavaから渡されたもの)を比較しています。2番目と3番目の例では、これを回避しています。

VARCHAR2はより自然で一般的に使用されるため、使用することをお勧めします。不可能な場合は、Javaから渡した値をOracleで定義されているCHARサイズまでパディングしてみてください。

于 2013-01-15T16:35:53.980 に答える