*************************
環境
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)のように投げてそのまま戻って
くるものは削られるようです。
上記例のようにリテラル文字列を使用することができないので
困っております。何か回避する方法をご存知の方、ご教授いた
だけないでしょうか。
よろしくお願いいたします。
はじめまして。私も初心者ですが、
ちなみに、以下のように変更すると、どのように返りますか?
A) 'select ''田中'' as name from dual;'
B) 'select "田中" as name from dual;'
fuji_yohooさん、早速のご返信ありがとうございます。
早速実行してみました。
>A) 'select ''田中'' as name from dual;'
from句が指定の位置にありません。というエラーが返ってきました。
select 〜 from句の構文が正しく判断されていない感じです。
>B) 'select "田中" as name from dual;'
列名が無効です。というエラーが返ってきました。
ダブルコーテーションがあることでOracleはテーブルに定義された列名と判断したようです。
ちなみに『;』は私の消し忘れです。すみません。
『;』は無しで動作しております。
よろしくお願い致します。
oracleは使ったことないですが
CASTで明示的に宣言してもダメでしょうか?
SELECT文をViewにして実行してもダメですか?
CRAETE VIEW Hoge (Name)
AS
SELECT '田中'
FROM Dual
お返事が遅くなりまして申し訳ありません。
試しにさんありがとうございます。
>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の不具合なの
か私の環境や設定に問題があるのかがわかりません。
試しにさんが提案くださったようにひとつずつ置き換えを
地道に行う以外に方法がないのであればその方向で考えて
おりますがいかがでしょうか。
よろしくお願いいたします。
nls_languegeはJapaneseですか?
英語のOracleをインストールすると
デフォルトが西ヨーロッパ iso-8859-1だったと思います
nobukoshi802さん返信ありがとうございます。
>nls_languegeはJapaneseですか?
SQL*PLUSにて
SELECT * FROM V$NLS_PARAMETERS
で調べましたが、JAPANESEになっていました。
>英語のOracleをインストールすると
どこで判断すればよいのかわからないですが、
おそらく日本語版ではないかと思います。一
緒にインストールされるDBA STUDIOなどは日本
語で使用できていますので・・・。
なにかわかりそうでしょうか。
よろしくお願いいたします。
NLS_CHARACTERSETの値ですね
うちでは、JA16SJISになっています
この値はOracleのinit.oraで設定しています
この値が違うと、サーバの文字セットと
クライアントの文字セットが違うので文字化けが発生します
DB管理者に聞いてみてください
Oracle10gXEだと、無条件に文字セットがUnicodeになっていて
Ansiを選択出来なくて導入を見合わせたことがあります
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になります。
よろしくお願い致します。
かめレスですが
SQL文に
SELECT 'テスト' FROM Dual
SQLQuery1.Open;
ShowMessage(SQLQuery1.Fields[0].AsString);
SQLQuery1.Close;
を実行すると無事?に’テスト’と表示されます。
とするとあやしいのが
Clientdataset
Datasetprovider
どちらかで文字変換がうまく動作していないと思われます
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
・その他の特別な設定などありましたら
よろしくお願いいたします。
あ、これ
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200902/09020038.txt
と似ている気がします。(マルチポストの指摘ではありません)
MSのドライバでも同じ現象でしょうか?
にー様、情報提示ありがとうございます。
オラクルクライアントのバージョンで不具合発生は考えられますね。
テーブルの項目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のドライバが無いですね。
参考になれば良いですが。
にーさん返信ありがとうございます。
確かに現象は似ておりますね。
>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を教わってよろしいでしょうか。
よろしくお願いいたします。
残念ながら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/
くらいですかね。
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
の購入が決定しましたので、そちらでの検証でうまく
いきましたらまたここに報告させていただきます。
(無論、現行の調査も続けるつもりです。)
ツイート | ![]() |