[seasar-dotnet:1611] Re: 外だしSQLについて

笹木 悠壱 [E-MAIL ADDRESS DELETED]
2010年 3月 19日 (金) 00:03:41 JST


久保様

お世話になっております。笹木です。

仰る通り、Courseカラムの大なり小なり条件が想定外のものになるということです。

そして、ご指示いただいた内容に沿って、再度検証してみました。


【A-1. 埋め込み変数コメントを利用して実行してみる】

■テーブル
テーブルの内容は前回と同じです。

■外だしSQL
SELECT *
  FROM M_LESSON
 WHERE COURSE >= /*$pmb.CourseFrom*/
   AND COURSE <= /*$pmb.CourseTo*/

変数値
/*$pmb.CourseFrom*/→"'T初級'"
/*$pmb.CourseTo*/→"'T上級'"

→結果は、2レコードとなりました。
 1,"20100301","1000","1100","T初級"
 1,"20100301","1200","1300","T上級"


【A-2. SQL*Plusでバインド変数を利用して実行してみる】

■テーブル
テーブルの内容は前回と同じです。

■SQL*Plus
SQL> variable coursefrom varchar2(6)
SQL> variable courseto varchar2(6)

SQL> execute :coursefrom := 'T初級'

PL/SQLプロシージャが正常に完了しました。

SQL> execute :courseto := 'T上級'

PL/SQLプロシージャが正常に完了しました。

SQL> print :coursefrom

COURSEFROM
--------------------------------
T初級

SQL> print :courseto

COURSETO
--------------------------------
T上級

SQL> select * from M_LESSON where COURSE >= :coursefrom and COURSE <= 
:courseto;


     TENPO DATE     STAR END  COURSE
---------- -------- ---- ---- ------
         1 20100301 1000 1100 T初級
         1 20100301 1200 1300 T上級

→結果は、2レコードとなりました。


【B-1. 全角文字の値を止めてみる】

■テーブル
1,20100301,1300,1400,abc
1,20100301,1400,1500,def
1,20100301,1500,1600,ghijk
1,20103001,1600,1700,lmno
1,20103001,1700,1800,pqrstu
1,20103001,1800,1900,vwxyz

■実行①
Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-18 20:59:12,149 [1] 
DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
  FROM M_LESSON
 WHERE COURSE >= 'c'
   AND COURSE <= 'y'

→結果は、5レコードです。
1,20100301,1400,1500,def
1,20100301,1500,1600,ghijk
1,20103001,1600,1700,lmno
1,20103001,1700,1800,pqrstu
1,20103001,1800,1900,vwxyz

■実行①をsqlplusで実行
SQL> select * from M_LESSON where COURSE >= 'c' and COURSE <= 'y';

     TENPO DATE     STAR END  COURSE
---------- -------- ---- ---- ------
         1 20100301 1400 1500 def
         1 20100301 1500 1600 ghijk
         1 20103001 1600 1700 lmno
         1 20103001 1700 1800 pqrstu
         1 20103001 1800 1900 vwxyz
→結果は、5レコードとなり、同じ結果を得られました。

■実行②
Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-18 21:01:06,220 [1] 
DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
  FROM M_LESSON
 WHERE COURSE >= 'fgh'
   AND COURSE <= 'qrs'

→結果は、3レコードです。
1,20100301,1500,1600,ghijk
1,20103001,1600,1700,lmno
1,20103001,1700,1800,pqrstu

■実行②をsqlplusで実行
SQL> select * from M_LESSON where COURSE >= 'fgh' and COURSE <= 'qrs';

     TENPO DATE     STAR END  COURSE
---------- -------- ---- ---- ------
         1 20100301 1500 1600 ghijk
         1 20103001 1600 1700 lmno
         1 20103001 1700 1800 pqrstu
→結果は、3レコードとなり、同じ結果を得られました。


【B-2. 別の全角文字を使ってみる】

■テーブル①
1,20100301,1300,1400,あいう
1,20100301,1400,1500,えおか
1,20100301,1500,1600,きくけ
1,20103001,1600,1700,こさし
1,20103001,1700,1800,すせそ
1,20103001,1800,1900,たちつ

■実行①
Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-18 21:54:27,890 [1] 
DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
  FROM M_LESSON
 WHERE COURSE >= 'お'
   AND COURSE <= 'さ'

→結果は、2レコードです。
1,20100301,1500,1600,きくけ
1,20103001,1600,1700,こさし

■実行①をsqlplusで実行
SQL> select * from M_LESSON where COURSE >= 'お' and COURSE <= 'さ';

     TENPO DATE     STAR END  COURSE
---------- -------- ---- ---- ------
         1 20100301 1500 1600 きくけ
         1 20103001 1600 1700 こさし
→結果は、2レコードとなり、同じ結果を得られました。

■テーブル②
1,20100301,1300,1400,上
1,20100301,1400,1500,下
1,20100301,1500,1600,左
1,20103001,1600,1700,右
1,20103001,1700,1800,前
1,20103001,1800,1900,後

■実行②
Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-18 22:16:38,262 [1] 
DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
  FROM M_LESSON
 WHERE COURSE >= '右'
   AND COURSE <= '左'

→結果は、2レコードです。
1,20100301,1500,1600,左
1,20103001,1600,1700,右

■実行②をsqlplusで実行
SQL> select * from M_LESSON where COURSE >= '右' and COURSE <= '左';

     TENPO DATE     STAR END  COURSE
---------- -------- ---- ---- ------
         1 20100301 1400 1500 下
         1 20100301 1500 1600 左
         1 20103001 1600 1700 右
         1 20103001 1800 1900 後
→結果は、4レコードとなり、違う結果になりました。


【DB側で利用しているエンコーディング】

Oralceのエンコーディングを確認しました。
以下の設定内容のことですよね?シフトJISでした。
NLS_CHARACTERSET=JA16SJISTILDE
NLS_NCHAR_CHARACTERSET=AL16UTF16


大した検証はしていないですが、漢字が入ると思った通りの結果が得られないようです。 

DB側の設定は関係あるのでしょうか?

以上、宜しくお願い申し上げます。

笹木

----- Original Message ----- 
From: "kubo" <[E-MAIL ADDRESS DELETED]>
To: <[E-MAIL ADDRESS DELETED]>
Sent: Thursday, March 18, 2010 7:47 PM
Subject: [seasar-dotnet:1608] Re:外だしSQLについて


> 久保(jflute)です。
>
> 笹木さん、こんばんは
>
> 問題を整理すると:
>
> 最初、「パラメータコメントで全角文字を使うと...」
> だったのが、再度の検証の結果、
> 「全角文字の利用の有無に関係なく、Courseカラム
> の大なり小なり条件が想定外のものになる」
> ということになりますでしょうか?
>
> A. バインド変数の有無で影響している(かも)
> B. 全角文字のデータ値が影響している(かも)
>
> とりあえず思いつく、以上の二点に関して検証して
> みるともう少し状況がクリアになってくるかもしれません。
>
> <A>
> A-1. 埋め込み変数コメントを利用して実行してみる
> A-2. SQL*Plusでバインド変数を利用して実行してみる
>
> <B>
> B-1. 全角文字の値を止めてみる (abc, def とか単純なのでお試し)
> B-2. 別の全角文字を使ってみる
> *DB側で利用しているエンコーディングは何でしょう?
> (原因としてちょっと考えずらいですが...)
>
> 2010/3/18 笹木 悠壱 <[E-MAIL ADDRESS DELETED]>:
>> 藤井様
>>
>> お世話になっております。笹木です。
>>
>> ご確認いただき、ありがとうございます。
>> ご指摘いただいた点を踏まえて、再度検証してみました。
>>
>> まず、S2Dao.NET用のインターフェイスの書き方に誤りはございませんでした。
>> また、インターフェイスとテーブルについて、2バイト文字、漢字等を使用せずに
>> 実行してみましたが、結果は同じでした。
>> (結果は下記の通りです。)
>>
>> それから、SQL文自体はこれで通ります。
>> WHERE句の中のANDをORに変えて実行した場合、sqlplusで3件帰ってきてしまいます。 
>> 
>> (結果は下記の通りです。)
>>
>>
>> ■テーブル
>> ・テーブル名
>>   M_LESSON
>> ・フィールド
>>   TENPO  NUMBER(3,0) (PK)
>>   DATE VARCHAR2(8) (PK)
>>   START  VARCHAR2(4) (PK)
>>   END   VARCHAR2(4)
>>   COURSE VARCHAR2(6)
>>
>> ■上記テーブル内のレコード
>>  1,"20100301","1000","1100","T初級"
>>  1,"20100301","1100","1200","T中級"
>>  1,"20100301","1200","1300","T上級"
>>
>> ■実行①(外だしSQLでパラメータコメントを使用)
>>
>> SELECT *
>>  FROM M_LESSON
>> WHERE COURSE >= /*pmb.CourseFrom*/
>>  AND COURSE <= /*pmb.CourseTo*/
>>
>> パラメータ値
>>  pmb.CourseFrom→'T初級'
>>  pmb.CourseTo→'T上級'
>>
>> ⇒検索結果は、レコードなしとなります。
>>
>> (SQLログ)
>> Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-18 10:04:40,480 [1]
>> DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
>>  FROM M_LESSON
>> WHERE COURSE >= 'T初級'
>>  AND COURSE <= 'T上級'
>>
>> ■実行②(外だしSQLでパラメータコメントを使用をしない)
>>
>> SELECT *
>>  FROM M_LESSON
>> WHERE COURSE >= 'T初級'
>>  AND COURSE <= 'T上級'
>>
>> ⇒検索結果は、レコード2件となります。
>>  1,"20100301","1000","1100","T初級"
>>  1,"20100301","1200","1300","T上級"
>>
>> ■Daoインターフェイス
>>
>>  [Bean(typeof(CourseInfo))]
>>  public interface ICourseDao
>>  {
>>   IList<CourseInfo> SelectCourse(CoursePmb pmb);
>>  }
>>
>>  [System.Serializable]
>>  public class CourseInfo
>>  {
>>   string _Course;
>>
>>   public string Course
>>   {
>>     get { return _Course; }
>>     set { _Course = value; }
>>   }
>>  }
>>
>>  [System.Serializable]
>>  public class CoursePmb
>>  {
>>   string _CourseFrom;
>>
>>   public string CourseFrom
>>   {
>>     get { return _CourseFrom; }
>>     set { _CourseFrom = value; }
>>   }
>>
>>   string _CourseTo;
>>
>>   public string CourseTo
>>   {
>>     get { return _CourseTo; }
>>     set { _CourseTo = value; }
>>   }
>>  }
>>
>> ■sqlplusでの実行結果
>> SQL> select * from M_LESSON where COURSE >= 'T初級' and COURSE <= 'T上級';
>>
>>    TENPO DATE     STAR END  COURSE
>> ---------- -------- ---- ---- ------
>>        1 20100301 1000 1100 T初級
>>        1 20100301 1200 1300 T上級
>>
>> SQL> select * from M_LESSON where COURSE >= 'T初級' or COURSE <= 'T上級';
>>
>>    TENPO DATE     STAR END  COURSE
>> ---------- -------- ---- ---- ------
>>        1 20100301 1000 1100 T初級
>>        1 20100301 1100 1200 T中級
>>        1 20100301 1200 1300 T上級
>>
>> 以上、宜しくお願い申し上げます。
>>
>> 笹木
>>
>> ----- Original Message ----- From: "Hiroaki Fujii" 
>> <[E-MAIL ADDRESS DELETED]>
>> To: <[E-MAIL ADDRESS DELETED]>
>> Sent: Wednesday, March 17, 2010 10:52 PM
>> Subject: [seasar-dotnet:1605] Re: 外だしSQLについて
>>
>>
>>> 藤井です。
>>>
>>> 完全に一緒ではないのですが、Oracle10gXE、ODP、Quillが1.3.17の
>>> 環境で実行しましたが、再現しませんでした。
>>>
>>> もう少し調べる前に、お願いなのですが、S2Dao.NET用のインターフェイスの
>>> 書き方は間違えていることはないでしょうか?
>>> 引数や2バイト文字の漢字や1バイト文字をプロパティなどで混在して
>>> 使われているようですが、これらを間違えて使っていることはない
>>> でしょうか?
>>>
>>> それと、SQL文もこれで本当に通るか確認をお願いします。
>>> WHERE句の中のANDをORに変えたらsqlplusで2件帰ってきました。
>>>
>>> 確認をお願いいたします。
>>>
>>>
>>> ㈱ネスティ 笹木 悠壱 さんは書きました:
>>>>
>>>> はじめまして。
>>>> 笹木と申します。
>>>>
>>>> 外だしSQLについて質問させて下さい。
>>>> パラメータコメントに全角文字を指定すると、
>>>> 想定される結果を取得できないことがあります。
>>>>
>>>> パラメータコメントを使用せずに、直接書き込んで
>>>> 実行した場合は、思ったとおりの結果を取得できます。
>>>>
>>>> 何か設定が必要なのでしょうか?
>>>> 以下、実行内容です。
>>>>
>>>> ■開発環境
>>>>  OS:WindowsXP
>>>>  VisualStudio2008
>>>>  .NetFrameWork3.5
>>>>  Oracle11g(OS:Windos2008)
>>>>  S2Container.NET 1.3.17.0
>>>>  S2Dao.NET 1.3.17.0
>>>>
>>>> ■テーブル
>>>> ・テーブル名
>>>>   M_レッスン
>>>> ・フィールド
>>>>   店舗   NUMBER(3,0) (PK)
>>>>   日付   VARCHAR2(8) (PK)
>>>>   開始時刻 VARCHAR2(4) (PK)
>>>>   終了時刻 VARCHAR2(4)
>>>>   コース  VARCHAR2(6)
>>>>
>>>> ■上記テーブル内のレコード
>>>>  1,"20100301","1000","1100","T初級"
>>>>  1,"20100301","1100","1200","T中級"
>>>>  1,"20100301","1200","1300","T上級"
>>>>
>>>> ■実行①(外だしSQLでパラメータコメントを使用)
>>>>
>>>> SELECT *
>>>>  FROM M_レッスン
>>>>  WHERE コース >= /*pmb.コースFROM*/
>>>>   AND コース <= /*pmb.コースTO*/
>>>>
>>>> パラメータ値
>>>>  pmb.コースFROM→'T初級'
>>>>  pmb.コースTO→'T上級'
>>>>
>>>> ⇒検索結果は、レコードなしとなります。
>>>>
>>>> (SQLログ)
>>>> Seasar.Extension.ADO.Impl.BasicSelectHandler: 2010-03-17 12:01:30,400
>>>> [1] DEBUG Seasar.Framework.Log.Logger Debug - SELECT *
>>>>  FROM M_レッスン
>>>>  WHERE コース >= 'T初級'
>>>>   AND コース <= 'T上級'
>>>>
>>>> ■実行②(外だしSQLでパラメータコメントを使用をしない)
>>>>
>>>> SELECT *
>>>>  FROM M_レッスン
>>>>  WHERE コース >= 'T初級'
>>>>   AND コース <= 'T上級'
>>>>
>>>> ⇒検索結果は、レコード2件となります。
>>>>  1,"20100301","1000","1100","T初級"
>>>>  1,"20100301","1200","1300","T上級"
>>>>
>>>> SQLツールで実行した場合は、結果②と同じです。
>>>> 実行①で、実行②と同じ結果を取得するためには
>>>> どういった設定が必要なのでしょうか?
>>>>
>>>> 以上、宜しくお願い申し上げます。
>>>>
>>>> 笹木
>>>>
>>>>
>>>> ------------------------------------------------------------------------
>>>>
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>>
>>
>>
>> --------------------------------------------------------------------------------
>>
>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>
>>
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> 




seasar-dotnet メーリングリストの案内