- PR -

カナ文字列の順序を50音順にしたい

1
投稿者投稿内容
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2007-06-08 16:04
いつもお世話になっております。

Oracle8の文字列検索順序の調整方法について調べています。

 アアアア
 イアアア
 ウアアア
 エアアア
 オアアア
 ヲアアア

をデータに登録した場合、通常は

 ヲアアア
 アアアア
 イアアア
 ウアアア
 エアアア
 オアアア

のように並ぶと思います。
(※半角ヲが前に来るということがポイントです。)

それでは困ると思い調べたところ、

@Oracle初期化パラメータファイル(C:\orant\DATABASE\initorcl.ora)変更
  ファイルの最後に下記を追加
   nls_sort=japanese
AOS環境変数変更
  [システム]-[詳細設定]-[環境変数]にて新規に変数を追加
   変数名:NLS_SORT
   変数値:japanese

@、Aを設定すると

 アアアア
 イアアア
 ウアアア
 エアアア
 オアアア
 ヲアアア

のように並ぶとわかったので実行してみました。

テーブル作成後、Oracle Navigaterを開き新規行追加を行ったところ、
char型のフィールドを見ると、自動で'デフォルト値' のように'付きで
デフォルト値が入っていました。

で、そのまま主キー項目などを入力してcommitすると下記エラーが発生します。

 エラー:ora-00963(式がありません。)
 
これってなにかの制約でしょうか?(または仕様でしょうか?)
はたまた対処法などあるのでしょうか?
(※Oracle10gで発生するかどうかは現状では確認できていませんが、
  多分発生しそうな気がしてます。)

または、カナが通常の50音順で並ぶようにする設定方法でも構いません。
(SQLにNLSを追加して対応させるのは、変更量が多いので最後の最後と
 考えています。)

ご存知の方いらっしゃいましたら、よろしくお願いいたします。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-06-10 16:33
NLS_SORT=JAPANESEによりソート順を変更する際、制限は特になかったと思います

引用:

それでは困ると思い調べたところ、

@Oracle初期化パラメータファイル(C:orantDATABASEinitorcl.ora)変更
  ファイルの最後に下記を追加
   nls_sort=japanese
AOS環境変数変更
  [システム]-[詳細設定]-[環境変数]にて新規に変数を追加
   変数名:NLS_SORT
   変数値:japanese

@、Aを設定すると

 アアアア
 イアアア
 ウアアア
 エアアア
 オアアア
 ヲアアア

のように並ぶとわかったので実行してみました。


(2)の環境変数設定が、もしや不要なのではないでしょうか?

引用:

テーブル作成後、Oracle Navigaterを開き新規行追加を行ったところ、
char型のフィールドを見ると、自動で'デフォルト値' のように'付きで
デフォルト値が入っていました。

で、そのまま主キー項目などを入力してcommitすると下記エラーが発生します。

 エラー:ora-00963(式がありません。)
 
これってなにかの制約でしょうか?(または仕様でしょうか?)
はたまた対処法などあるのでしょうか?


NLS_SORTを変更しただけで上記のようなエラーが起こるようになるかどうかについて
上記のようなエラーにあったことが無いため、私に知識はありません。
以下項目についてはどうでしょう?

・初期化パラメータ・ファイル変更後、Oracleを起動しなおしましたでしょうか?
・NLS_SORTの設定を元に戻すとエラーなく動作しますでしょうか?
・NLS_SORTを戻してエラーにならなくなった場合、以下の文を
 発行してのソートではどうなるでしょうか?
ALTER SESSION SET NLS_SORT=JAPANESE;
Makoto
大ベテラン
会議室デビュー日: 2004/03/31
投稿数: 133
投稿日時: 2007-06-14 09:50
回答ありがとうございます。
(外出が続いていたため返信が遅れてすみません。)

ところで指摘して頂いた事項ですが下記のようになりました。

>・初期化パラメータ・ファイル変更後、Oracleを起動しなおしましたでしょうか?

はい

>・NLS_SORTの設定を元に戻すとエラーなく動作しますでしょうか?

はい

>・NLS_SORTを戻してエラーにならなくなった場合、以下の文を
> 発行してのソートではどうなるでしょうか?
>ALTER SESSION SET NLS_SORT=JAPANESE;

同じようにエラーです。

という残念な結果です。

ところで本件なのですが、どうも列制約でtonumber制約をつけていると
発生するようです。
現状、Oracle8はサポート期間が過ぎているため情報ソースに困っています...
(Oracle9i以降は発生しないようです。8iは持ってないのでわかりませんでした。)

ただ今回は、私が不在の間に下記のように決定していました。
(正直、変な処理でも時間をかけるよりはマシという判断のようです。)

●回避策
 デフォルトのNLSのままで、アプリ側で文字の順番を意識するように
実装変更しました。
 (今回は運用で、50音カナ、アルファベット、数字、キーボード上の記号しか
  使用しないのでアプリでも何とかできました。)
 ↑
 いやな感じですが、直らないよりはマシという感じです。

一応今回は苦肉の策で解決!?しました。
ありがとうございました。
(DBって難しい...)

また質問した際はよろしくお願い致します。
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-06-16 21:10
お力になれず、申し訳ありませんでした。
パラメータ設定がおかしくなっているのではないかと考えたのですが、
回答下さった内容からみると、そうではなかったようで。

環境変数への設定ですが、私は必要ないかもと書きましたが
どうやら必要な場合もあるようです。

「グローバリゼーション・サポート・ガイド」には
 1)SQLへ直接記述
 2)ALTER SESSIONでの設定
 3)環境変数での設定
 4)SPFILEでの設定
の優先度で設定されると記述があるのですが、
WindowsXP + Oracle9i
で検証してみたところ、NLS_SORTをSPFILEに設定しても反映してくれず、
環境変数やALTER SESSIONでの設定が必要になりました。

引用:

Makotoさんの書き込み (2007-06-14 09:50) より:
ところで本件なのですが、どうも列制約でtonumber制約をつけていると
発生するようです。


「tonumber制約」というのは知識がなくわからないのですが、
Binary以外のソートセットだとどうやってもエラーが発生してしまいそうな雰囲気ですね。
ですから、
引用:

●回避策
 デフォルトのNLSのままで、アプリ側で文字の順番を意識するように
実装変更しました。
 (今回は運用で、50音カナ、アルファベット、数字、キーボード上の記号しか
  使用しないのでアプリでも何とかできました。)


という方法も、影響範囲が狭いならありかとおもいます。
制約を外したりできないのであれば、DB側で何とかするにしても、
どちらにせよアプリの修正も必要になるでしょうから。
1

スキルアップ/キャリアアップ(JOB@IT)