[Seasar-user:2641] Re: 更新SQL自動生成について

J.r0ck j69
2005年 10月 1日 (土) 17:03:47 JST


J.r0ckです。

> お世話になっております
> NSQ@佐藤です
(中略)

> このようなプログラムがあった場合、dao#updateで自動生成されるSQLは
> 
> update HOGE set ID='4', NAME='TEST' where ID='4'
> 
> のような感じになります。
> この時WHERE句は ID='4   'ではなくID='4'となっている為、一致するデータは
> 0件となります
> そこで、自動生成されるSQLが
> update HOGE set ID='4', NAME='TEST' where ID='4   '
> のようになるような設定方法はありますでしょうか?
これは、S2に要求するのは...(汗)

ところで、DBはOracle8iですよね。

であれば、書かれている動作自体がおかしいなぁ。

> TABLE(HOGE)
> -----------------------------
> ID  char(4)   主キー
> NAME varchar2(10)
> ------------------------------

IDがCHAR型であれば、
> update HOGE set ID='4', NAME='TEST' where ID='4'
は成功するはずなんですが。

ちと長くなりますが、Oracle8i SQL リファレンス 2-32 データ型の比較規則より

1.空白埋め比較
2 つの値の長さが異なる場合、Oracle はまず短い方の値の最後に空白を追加
して、2 つの値が同じ長さになるようにします。次に、その2 つの値を、最初に異なる文字
まで1 文字ずつ比較します。最初に異なる文字の位置で、大きい方の文字を持つ値の方が大
きいとみなされます。2 つの値に異なる文字がない場合、その2 つの値は等しいとみなされ
ます。つまり、この規則では、2 つの値の後続空白数のみが異なる場合、その2 つの値は等
しいとみなされます。Oracle では、比較する両方の値が、CHAR データ型、NCHAR データ
型、テキスト・リテラルのいずれかの式の場合、またはUSER 関数の戻り値の場合のみ空白
埋め比較方法を使用します。

2.非空白埋め比較
Oracle は、2 つの値を、最初に異なる文字まで1 文字ずつ比較します。最
初に異なる文字の位置で、大きい方の文字を持つ値の方が大きいとみなされます。長さが異
なる2 つの値を短い方の値の最後まで比較して、すべて同じ文字だった場合、長い方の値が
大きいとみなされます。同じ長さの2 つの値に異なる文字がない場合、その2 つの値は等し
いとみなされます。Oracle では、比較する片方または両方の値がVARCHAR2 データ型また
はNVARCHAR2 データ型の場合、非空白埋め比較方法を使用します。

...ということで、IDがCHAR型ならば問題ないはずです。

9iの環境ですが、問題なく実行されます。

SQL> create table hoge (id char(4), name varchar2(10));

表が作成されました。

SQL> insert into hoge values ('4   ',  'aki');

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> select * from hoge where id = '4';

ID   NAME
---- ----------
4    aki

SQL> update hoge set name = 'natu' where id = '4';

1行が更新されました。

SQL> select * from hoge where id = '4';

ID   NAME
---- ----------
4    natu

以上


-- 
J.r0ck <[E-MAIL ADDRESS DELETED]>




Seasar-user メーリングリストの案内