問題ID:19581

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-11-18 2:35 | 最終変更
hakamatsu  新米   投稿数: 3
お世話になっております。
Oracle 11g の環境で、題名の問題を試すため下記の SQL を
実行したところ、エラーになります。

select TO_NUMBER('\500,000', 'L999,999') from dual;
*
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。

私の環境の NLS の CURRENCY に関するパラメータは下記の通りです。

SQL> select * from v$nls_parameters where PARAMETER like '%CURRENCY%';

PARAMETER VALUE
------------------------------ --------------------
NLS_CURRENCY \
NLS_ISO_CURRENCY JAPAN
NLS_DUAL_CURRENCY \

あれこれググった限りでは解決に至らず、質問させて頂きます。

よろしくお願いします。
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-11-19 22:45
arashi1977  長老 居住地: 広島  投稿数: 1715
hakamatsuさんの環境がわからないので推測でしか無いのですが…
フォントの影響かもしれませんが、エン(¥)サインとバックスラッシュは違いますのでもう一度入力値を確認してみてはいかがでしょうか?

私の手元の環境だとこうなりました。
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> select * from v$nls_parameters where PARAMETER like '%CURRENCY%';

PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_CURRENCY
¥

NLS_ISO_CURRENCY
JAPAN

NLS_DUAL_CURRENCY
\


SQL> select TO_NUMBER('¥500,000', 'L999,999') from dual;

TO_NUMBER('¥500,000','L999,999')
--------------------------------
			  500000

SQL> select TO_NUMBER('\500,000', 'L999,999') from dual;
select TO_NUMBER('\500,000', 'L999,999') from dual
                 *
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。
※投稿本文のエンサインが勝手にバックスラッシュに変換されるみたいなので、わざとエンサインを全角にしています。このまま実行するとORA-01722のエラーになりますのでご注意ください。

なし Re: 問題ID:19581

msg# 1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2017-11-21 1:23
hakamatsu  新米   投稿数: 3
情報ありがとうございます。

やはり正常な結果は出力されないようです。
記号(¥)は shift-jis で 0x5c である事は事前に確認済です。
環境の文字コードも(centos 標準の)UTF8 です。

[oracle@CentOS3 ~]$ cat /etc/sysconfig/i18n LANG="ja_JP.UTF-8"
[oracle@CentOS3 ~]$ sqlplus pingt/oracle
SQL> col PARAMETER for a30
SQL> col value for a30
SQL> list
   1  select * from v$nls_parameters
SQL> /

PARAMETER                      VALUE
------------------------------ ------------------------------ 
NLS_LANGUAGE                   JAPANESE
NLS_TERRITORY                  JAPAN
NLS_CURRENCY                   \
NLS_ISO_CURRENCY               JAPAN
NLS_NUMERIC_CHARACTERS         .,
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                RR-MM-DD
NLS_DATE_LANGUAGE              JAPANESE
NLS_CHARACTERSET               AL32UTF8
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH24:MI:SSXFF
NLS_TIMESTAMP_FORMAT           RR-MM-DD HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT        RR-MM-DD HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY              \
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
  19行が選択されました。

SQL> select to_number( '\500,000', 'L999,999' ) from dual;
select to_number( '\500,000', 'L999,999' ) from dual
                  *
行1でエラーが発生しました。:
ORA-01722: 数値が無効です。

なし Re: 問題ID:19581

msg# 1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-11-21 9:35
arashi1977  長老 居住地: 広島  投稿数: 1715
念のため確認なのですが

1. NLS_CURRENCYとNLS_DUAL_CURRENCYの値は同じですか?
例えばNLS_CURRENCYの値をコピーしても結果は同じですか?

2.
[oracle@CentOS3 ~]$ cat /etc/sysconfig/i18n LANG="ja_JP.UTF-8"
これは
$ echo $LANG
しても結果は同じですか?

そうであれば、
引用:
記号(¥)は shift-jis で 0x5c である事は事前に確認済です。
環境の文字コードも(centos 標準の)UTF8 です。
CentOSではUTF8なのにshift-jisの話をされているので、Windows7とかより前の環境からCentOSに繋いで、そこでSQLを入力してるってことですかね?(U+00A5を送れない?)

あと、UTF-8でのバックスラッシュとエンサインの違いについて参考になりそうなURL貼っときます。
http://blog.cognitom.com/post/7615020471/yen-mark

なし Re: 問題ID:19581

msg# 1.1.1.2
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-11-21 12:54
quensan  長老   投稿数: 119
私の環境で再現するものとしないものがありました。(どちらもCentOS 6.5)
再現しないものと hakamatsu さんの環境での共通点はNLS_CHARACTERSETが"AL32UTF8"になっていることです。
再現するもの -> Oracle 11g、NLS_CHARACTERSETが"AL32UTF8"
再現しないもの -> Oracle 12c、NLS_CHARACTERSETが"JA16EUC"

NLS_CHARACTERSETはもう変えられないので、とりあえずの対処としてNLS_CURRENCYをCentOSで直接入力した「\」に変えたら、エラーは出なくなりました。
SQL> alter session set nls_currency='\';

セッションが変更されました。

SQL> select to_number('\500,000', 'L999,999') from dual;

TO_NUMBER('\500,000','L999,999')
--------------------------------
			  500000

なし Re: 問題ID:19581

msg# 1.1.1.2.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2017-11-22 0:09
hakamatsu  新米   投稿数: 3
お世話になっております。

arashi1977 さん、quensan さん、情報提供ありがとうございました。

私も自社環境では問題なく実行できていました。

arashi1977 さんご指摘の文字コードで、もしやと思い
quensan さんご指摘の通り NLS_CHARACTERSET を調べたら
やはり AL32UTF8 となっていました。
(自社環境は JA16SJISTILDE でした)

これは変更できないんですね。。

NLS_CURRENCY を直接入力したら問題なく実行できるようになりました。

ありがとうございました。
今回はお二人のお陰でとても勉強になりました。
Bronze 取れるよう、頑張ります!

なし Re: 問題ID:19581

msg# 1.1.1.2.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2017-11-22 10:21
arashi1977  長老 居住地: 広島  投稿数: 1715
解決したみたいでよかったです

で、変換についてですがとっても大変みたいです。
参考になりそうなものがあったので、URL貼っときます

http://skill-note.net/post-587/

引用:
Bronze 取れるよう、頑張ります!
がんばってください!
# 自分もOracleMaster取得してみようかなぁ…

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.