SQL文にてリテラル文字列を使用できない


入門者  2009-01-29 05:36:29  No: 33229

*************************
環境
delphi2007
oracle8i
*************************

以下をformに貼り付けてDBへの接続を行います
Clientdataset
Datasetprovider
Sqlquery
Sqlconnection

以下のSQL文をsqlqueryに貼り付けて実行すると戻り値がおかしくなります。

EX1)
select '1' as name from dual;
-------------------------------
''
EX2)
select '10' as name from dual;
--------------------------------
'1'
EX3)
select '田中' as name from dual;
--------------------------------
'田・'  ←『・』の部分は文字化けしたような感じです。  
EX4)
select to_char('田中') as name from dual;
--------------------------------
'田中'

上記例を見るとわかると思いますが、どうやらリテラル文字列
の最後の1バイトを削って返ってきている様です。またEX4)の
ように一度関数にて加工された状態のものは問題なく返ってく
るようなのですが、EX1)〜EX3)のように投げてそのまま戻って
くるものは削られるようです。

上記例のようにリテラル文字列を使用することができないので
困っております。何か回避する方法をご存知の方、ご教授いた
だけないでしょうか。

よろしくお願いいたします。


fuji_yohoo  2009-01-29 18:38:48  No: 33230

はじめまして。私も初心者ですが、
ちなみに、以下のように変更すると、どのように返りますか?

A)  'select ''田中'' as name from dual;'
B)  'select "田中" as name from dual;'


入門者  2009-01-30 05:18:15  No: 33231

fuji_yohooさん、早速のご返信ありがとうございます。

早速実行してみました。

>A)  'select ''田中'' as name from dual;'
from句が指定の位置にありません。というエラーが返ってきました。
select 〜 from句の構文が正しく判断されていない感じです。

>B)  'select "田中" as name from dual;'
列名が無効です。というエラーが返ってきました。
ダブルコーテーションがあることでOracleはテーブルに定義された列名と判断したようです。

ちなみに『;』は私の消し忘れです。すみません。
『;』は無しで動作しております。

よろしくお願い致します。


試しに  2009-01-31 00:28:23  No: 33232

oracleは使ったことないですが
CASTで明示的に宣言してもダメでしょうか?


nobukoshi802  2009-01-31 04:36:23  No: 33233

SELECT文をViewにして実行してもダメですか?

CRAETE VIEW Hoge (Name)
AS
SELECT '田中'
  FROM Dual


入門者  2009-02-03 06:04:18  No: 33234

お返事が遅くなりまして申し訳ありません。

試しにさんありがとうございます。
>oracleは使ったことないですが
>CASTで明示的に宣言してもダメでしょうか?

CASTと申しますとORACLEの関数のことでしょうか?
つまり、EX4)のような感じでしょうか?

EX)
select Cast('田中' as VARCHAR2(4)) as name from dual

上記はやってみましたが、EX4)同様に正常に値が戻ります。
ただ現在取りかかっている業務がDELPHI5(BDE)からの移行
なのですが、SQL文の数が1000に近い数ですのでその置
き換えも現実的ではないかと考えております。またパフォ
ーマンスや負荷的な面でも心配しているため、あえて関数
を使用するパターンを避けております。
できれば素のままのSQL文でDelphi2007でのプロパティ
設定やDBExpressドライバの変更、Oracleの初期化パラメー
タの設定などSQL文をいじらずに何とかならないかと考
えております。

nobukoshi802さんありがとうございます。
>SELECT文をViewにして実行してもダメですか?

やってみましたが、だめでした。Viewにする前と同じ結果
でした。

この問題については皆さんの開発環境でも発生しますでし
ょうか。これはDELPHI2007におけるDBExpressの不具合なの
か私の環境や設定に問題があるのかがわかりません。
試しにさんが提案くださったようにひとつずつ置き換えを
地道に行う以外に方法がないのであればその方向で考えて
おりますがいかがでしょうか。

よろしくお願いいたします。


nobukoshi802  2009-02-05 06:04:30  No: 33235

nls_languegeはJapaneseですか?
英語のOracleをインストールすると
デフォルトが西ヨーロッパ iso-8859-1だったと思います


入門者  2009-02-07 03:55:32  No: 33236

nobukoshi802さん返信ありがとうございます。

>nls_languegeはJapaneseですか?
SQL*PLUSにて
SELECT * FROM V$NLS_PARAMETERS
で調べましたが、JAPANESEになっていました。

>英語のOracleをインストールすると

どこで判断すればよいのかわからないですが、
おそらく日本語版ではないかと思います。一
緒にインストールされるDBA STUDIOなどは日本
語で使用できていますので・・・。

なにかわかりそうでしょうか。

よろしくお願いいたします。


nobukoshi802  2009-02-10 21:39:08  No: 33237

NLS_CHARACTERSETの値ですね
うちでは、JA16SJISになっています
この値はOracleのinit.oraで設定しています
この値が違うと、サーバの文字セットと
クライアントの文字セットが違うので文字化けが発生します
DB管理者に聞いてみてください
Oracle10gXEだと、無条件に文字セットがUnicodeになっていて
Ansiを選択出来なくて導入を見合わせたことがあります


入門者  2009-02-13 06:13:08  No: 33238

nobukoshi802さん、ご返信ありがとうございます。

>NLS_CHARACTERSETの値ですね
>うちでは、JA16SJISになっています
>この値はOracleのinit.oraで設定しています

私の環境でも確認してみましたが、サーバ、クライア
ントともにJA16SJISになっています。
ただし、init.oraというファイルはなかったのですが、
init<SID>.oraはありましたのでそちらで確認したと
ころNLS_CHARACTERSETというパラメータが見つかりま
せんでした。そのため、前回同様のV$NLS_PARAMETERS
より確認しました。
クライアント側についてはレジストリよりNLS_LANG
から調べました。

>この値が違うと、サーバの文字セットと
>クライアントの文字セットが違うので文字化けが発生します
>DB管理者に聞いてみてください
>Oracle10gXEだと、無条件に文字セットがUnicodeになっていて
>Ansiを選択出来なくて導入を見合わせたことがあります

大変参考になります。ただ、お恥ずかしながらうち
にはDB管理者なる者がとくにおりませんので自分
で調べてみた次第です。
今回の件ですが、文字化けが発生していると私も、
にらんでいたのですが、文字化けというより、正常
にSQLが動作するSQL*PLUSなどで以下のSQL文
を実行したイメージの方が近いかなと思っております。

SELECT SUBSTRB('田中',1,3) FROM DUAL

最後の1バイトだけを無視して無理やり結果を返そ
うとする感じですね。そのため'中'という文字の1
バイト分だけを認識しようとしている。

※申し遅れておりますが、
DBサーバはWindows2000 Server
クライアントはWindowsXP Proになります。

よろしくお願い致します。


nobukoshi802  2009-03-04 05:18:28  No: 33239

かめレスですが

SQL文に
SELECT 'テスト' FROM Dual

SQLQuery1.Open;
ShowMessage(SQLQuery1.Fields[0].AsString);
SQLQuery1.Close;

を実行すると無事?に’テスト’と表示されます。
とするとあやしいのが
Clientdataset
Datasetprovider
どちらかで文字変換がうまく動作していないと思われます


入門者  2009-03-07 10:48:00  No: 33240

nobukoshi802さん、ご返信ありがとうございます。
レスが遅くなりすみません。

>SQL文に
>SELECT 'テスト' FROM Dual
>
>SQLQuery1.Open;
>ShowMessage(SQLQuery1.Fields[0].AsString);
>SQLQuery1.Close;
>
>を実行すると無事?に’テスト’と表示されます。
>とするとあやしいのが
>Clientdataset
>Datasetprovider
>どちらかで文字変換がうまく動作していないと思われます

SQLQueryのみで実行しましたが、結果は同様に最後
の文字が正しく取得できない様です。
つまり、ClientDatasetと>DatasetProviderは関係が
なさそうですね。

私の環境とはnobukoshi802さんの実行された環境
はどこか異なるのかも知れません。
よろしければ試された環境を教えていただけない
でしょうか。
・Delphiのバージョン
・Oracleのバージョン
・DBサーバーのOS
・クライアントのOS
・その他の特別な設定などありましたら

よろしくお願いいたします。


にー  2009-03-07 14:08:55  No: 33241

あ、これ
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200902/09020038.txt
と似ている気がします。(マルチポストの指摘ではありません)
MSのドライバでも同じ現象でしょうか?


nobukoshi802  2009-03-10 00:01:51  No: 33242

にー様、情報提示ありがとうございます。
オラクルクライアントのバージョンで不具合発生は考えられますね。
テーブルの項目varchar2とnvarchar2で取得情報には
違いはありませんでした。

私の環境ですが
Delphi2009 SP2
端末側 Oracle 10.2.0.3 サーバ側Oracle 10.2.0.4
DBサーバのOS Windows2003 SP2(32bit)
端末側OS WindowsXP SP3(32bit)
DBExpressを使用して接続しています。
オラクルのパッチサイトも8.1.7しか残っていませんでした。
8.1.5もしくは8.1.6ならバッチ供給はMetaLinkからになりますね。
DBExpressを使用しているので、直接OCIコールをしているので
MSのドライバが無いですね。
参考になれば良いですが。


入門者  2009-03-10 09:34:36  No: 33243

にーさん返信ありがとうございます。

確かに現象は似ておりますね。
>MSのドライバでも同じ現象でしょうか?
今回の現象がドライバに依存しているのであれば
切り分けのためにも変更してみたいところですが、
ドライバについては勉強不足で申し訳ないのですが
詳しくはわかっておりません。
現在はDelphi5(BDE)からDelphi2007への移行を行って
おります。できればソースは変更しないでおきたいの
ですが、ドライバのみを変更することは可能なのでしょ
うか。

nobukoshi802さん返信ありがとうございます。

私の環境ですが
・Delphiのバージョン:DELPHI2007
・Oracleのバージョン:Oracle 8.1.7(Work Group Server)
・DBサーバーのOS:Windows2000
・クライアントのOS:WindowsXP(SP2)

同じなのはクライアントのOS部分のみですので
ちょっとあたりをつけにくいですね。
上記環境の違いからすると、DELPHI2007の不具合で
あればDELPHI2009では修正されている可能性もあり
ますね。
また気になったのですが、
>オラクルのパッチサイトも8.1.7しか残っていませんでした。
上記のようなパッチは保守などの契約なしで入手可能
でしょうか?Oracleサイトを探してみたのですが、見
当たりませんでした。保守契約なしでも入手可能であ
ればURLを教わってよろしいでしょうか。

よろしくお願いいたします。


nobukoshi802  2009-03-10 21:41:59  No: 33244

残念ながらOracleのパッチは年間契約者のみとなっています。
(新規購入時に1年保守が必須です。)
ただし、Object OLE for Oracle(OO4O)
JDBC,ODBCの接続のドライバはOTNより最新をDownload出来ます。
http://www.oracle.com/technology/global/jp/software/tech/windows/ole/index.html

それとDelphi7.1も環境としてありますが
こちらも同様な現象は発生していないです。
Delphi7.1+DOA4.5(allroundのコンポーネントを使用)
http://www.teppi.com/Components/DOA/

無料なら
http://sourceforge.net/projects/delphioci/

それと
http://www.da-soft.com/component/option,com_docman/task,cat_view/gid,30/Itemid,87/

くらいですかね。


入門者  2009-03-12 08:17:44  No: 33245

nobukoshi802さん返信ありがとうございます。

>残念ながらOracleのパッチは年間契約者のみとなっています。
>(新規購入時に1年保守が必須です。)

ほんとに残念です・・・。(T_T)

>ただし、Object OLE for Oracle(OO4O)
>JDBC,ODBCの接続のドライバはOTNより最新をDownload出来ます。
>http://www.oracle.com/technology/global/jp/software/tech/windows/ole/index.html

たくさんご紹介していただきありがとうございます。
今回は移行ということもあり、ほとんどのDBExpress
でのコーディングは一通り完了しているためドライバ
そのものを変更するとなるとおそらく許可がおりない
と思います。
ただ不具合の切り分けと、後学のためにはぜひ試させ
ていただきます。

>それとDelphi7.1も環境としてありますが
>こちらも同様な現象は発生していないです。
>Delphi7.1+DOA4.5(allroundのコンポーネントを使用)
>http://www.teppi.com/Components/DOA/

DOAは現在のプロジェクトが開始される前に一度上司に
進めてみたことがあるのですが予算が厳しいのでDBEx
pressでなんとかするようにといわれてしまい今に至っ
ております。(当時もっと強く押しておけば・・・)

今回のnobukoshi802さんに教わった環境をリーダーに
報告してみました。nobukoshi802さんとできるだけ同
じ環境にしたいということでプロジェクトリーダーに
相談したところ、来年度予算にてDelphi2009とOracle10g
の購入が決定しましたので、そちらでの検証でうまく
いきましたらまたここに報告させていただきます。
(無論、現行の調査も続けるつもりです。)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加