[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 メーリングリストの案内