この章では、グローバリゼーション・サポート環境でのSQLプログラミングに役立つ情報について説明します。この章の内容は、次のとおりです。
動作をグローバリゼーション・サポートの規則に依存しているすべてのSQL関数で、NLSパラメータを指定できます。これらの関数は、次のとおりです。
これらの関数のNLSパラメータを明示的に指定すると、セッションのNLSパラメータに依存せずに関数を評価できます。この機能は、数字や日付が文字列リテラルとして含まれているSQL文で重要となる場合があります。
たとえば、次の問合せは、日付に対する言語がAMERICAN
に指定されている場合、正しく評価されます。
SELECT last_name FROM employees WHERE hire_date > '01-JAN-2005';
このような問合せを現行の日付言語に依存しないようにするには、次のような文を使用します。
SELECT last_name FROM employees WHERE hire_date > TO_DATE('01-JAN-2005','DD-MON-YYYY', 'NLS_DATE_LANGUAGE = AMERICAN');
このようにして、セッションの言語に依存しないSQL文を、必要に応じて定義できます。文字列リテラルが、ビュー、CHECK
制約またはトリガー内のSQL文にある場合には、このような文の指定が必要となる場合があります。
注意: ロケール依存のSQL関数でオプションのNLSパラメータを明示的に指定する必要があるのは、セッションのNLSパラメータ値に依存しない必要があるSQL文のみです。通常、SQL関数でNLSパラメータにセッションのデフォルト値を使用するほうが、パフォーマンスが改善されます。 |
すべての文字関数は、シングルバイトとマルチバイトの両方の文字をサポートします。単位を明示的に示した場合を除いて、文字関数は、バイト単位ではなく文字単位で動作します。
これ以降の内容は、次のとおりです。
SQL関数でビューやトリガーが評価される場合、NLS関数パラメータには現行のセッションからのデフォルト値が使用されます。SQL関数でCHECK
制約が評価される場合は、データベースの作成時にNLSパラメータに指定されたデフォルト値が使用されます。
NLSパラメータは、SQL関数で次のように指定できます。
'parameter
=value
'
次に例を示します。
'NLS_DATE_LANGUAGE = AMERICAN'
SQL関数では、次のNLSパラメータを指定できます。
NLS_DATE_LANGUAGE
NLS_NUMERIC_CHARACTERS
NLS_CURRENCY
NLS_ISO_CURRENCY
NLS_DUAL_CURRENCY
NLS_CALENDAR
NLS_SORT
表9-1に、特定のSQL関数に有効なNLSパラメータを示します。
表9-1 SQL関数と有効なNLSパラメータ
SQL関数 | 有効なNLSパラメータ |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次の例に、SQL関数でNLSパラメータを使用する方法を示します。
TO_DATE ('1-JAN-99', 'DD-MON-YY', 'nls_date_language = American') TO_CHAR (hire_date, 'DD/MON/YYYY', 'nls_date_language = French') TO_CHAR (SYSDATE, 'DD/MON/YYYY', 'nls_date_language=''Traditional Chinese'' ') TO_NUMBER ('13.000,00', '99G999D99', 'nls_numeric_characters = '',.''') TO_CHAR (salary, '9G999D99L', 'nls_numeric_characters = '',.'' nls_currency = ''EUR''') TO_CHAR (salary, '9G999D99C', 'nls_numeric_characters = ''.,'' nls_iso_currency = Japan') NLS_UPPER (last_name, 'nls_sort = Swiss') NLSSORT (last_name, 'nls_sort = German')
注意: 一部の言語では、様々な小文字が複数の大文字に、またはその逆に対応する場合もあります。その結果、NLS_UPPER 、NLS_LOWER およびNLS_INITCAP 関数の出力の長さが入力の長さと異なる場合があります。 |
次のNLSパラメータは、NLSSORT
を除くSQL関数では受け入れられません。
NLS_LANGUAGE
NLS_TERRITORY
NLS_DATE_FORMAT
NLS_DATE_FORMAT
およびNLS_TERRITORY_FORMAT
は、必要な書式マスクを妨げる可能性があるため、パラメータとしては受け入れられません。TO_CHAR
関数またはTO_DATE
関数にNLSパラメータがある場合は、常に、日付書式を指定する必要があります。このため、NLS_DATE_FORMAT
およびNLS_TERRITORY_FORMAT
は、TO_CHAR
またはTO_DATE
関数に対する有効なNLSパラメータではありません。TO_CHAR
またはTO_DATE
関数でNLS_DATE_FORMAT
またはNLS_TERRITORY_FORMAT
を指定すると、エラーが戻されます。
NLS_LANGUAGE
は、NLS_DATE_LANGUAGE
のセッション値を妨げる可能性があります。たとえば、TO_CHAR
関数でNLS_LANGUAGE
を指定した場合、その値がNLS_DATE_LANGUAGE
のセッション値と異なっていれば無視されます。
この項の内容は、次のとおりです。
CONVERT
関数は、キャラクタ・セット間で文字データを変換します。
CONVERT
関数は、あるキャラクタ・セットの文字列のバイナリ表現を、別のキャラクタ・セットのバイナリ表現に変換します。データベースとクライアントの間のキャラクタ・セット変換とまったく同じ方法を使用します。したがって、置換文字を使用するため、同じ制限があります。
CONVERT
の構文は、次のとおりです。
CONVERT(char
,dest_char_set
[,source_char_set
])
char
は変換される値です。source_char_set
は変換元キャラクタ・セットでdest_char_set
は変換先キャラクタ・セットです。source_char_set
パラメータが指定されていない場合、データベース・キャラクタ・セットがデフォルト値として使用されます。
関連項目:
|
Oracleには、様々な長さセマンティクスに従って動作するSQL関数が用意されています。この種のSQL関数は、SUBSTR
、LENGTH
およびINSTR
という3つのグループに分かれています。グループ内の各関数は異なる種類の長さセマンティクスに基づいており、関数名に追加される文字または数字で区別されます。たとえば、SUBSTRB
はバイト・セマンティクスに基づいています。
SUBSTR
関数は、サブストリングの要求された部分を戻します。LENGTH
関数は、文字列の長さを戻します。INSTR
関数は、文字列内のサブストリングを検索します。
SUBSTR
関数は、文字列の長さを様々な方法で計算します。表9-2に、計算方法を示します。
表9-2 SUBSTR関数による文字列の長さの計算方法
関数 | 計算方法 |
---|---|
文字列の長さを、データ型のキャラクタ・セットに関連付けられた長さセマンティクスに基づいて、文字数単位で計算します。たとえば、AL32UTF8の文字は、UCS-4文字の数で計算されます。UTF8およびAL16UTF16の文字は、UCS-2文字の数で計算されます。1つの補助文字は、AL32UTF8では1文字、UTF8およびAL16UTF16では2文字としてカウントされます。 |
|
文字列の長さをバイト数単位で計算します。 |
|
文字列の長さを、Java文字列とWindowsクライアント環境に準拠するUCS-2文字の数で計算します。各文字は、UCS-2または16ビットUnicode値で表されます。補助文字は2文字としてカウントされます。 |
|
文字列の長さをUCS-4文字数で計算します。各文字は、UCS-4または32ビットUnicode値で表されます。補助文字は1文字としてカウントされます。 |
|
文字列の長さをUnicode合成文字数で計算します。補助文字と合成文字は、1文字としてカウントされます。 |
LENGTH
およびINSTR
関数は、関数名に追加された文字または数字に従って、文字列の長さを同様の方法で計算します。
次に、データベース・キャラクタ・セットがAL32UTF8のデータベースで、SUBSTR
とSUBSTRB
を実行した場合の相違がわかる例を示します。
Fußball
文字列の場合、次の文では2文字目からの長さ4文字のサブストリングが戻されます。
SELECT SUBSTR ('Fußball', 2 , 4) SUBSTR FROM DUAL; SUBS ---- ußba
Fußball
文字列の場合、次の文では2バイト目からの長さ4バイトのサブストリングが戻されます。
SELECT SUBSTRB ('Fußball', 2 , 4) SUBSTRB FROM DUAL; SUB --- ußb
関連項目: SUBSTR 、LENGTH およびINSTR 関数の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
LIKE
条件によって、パターン一致を使用するテストを指定します。等価演算子(=)は、ある文字の値と別の文字の値を完全に照合しますが、LIKE
条件は、1番目の値の中に2番目で指定されたパターンがあるかどうかを検索し、ある文字の値と別の文字の値の一部を照合します。
LIKE
では、入力のキャラクタ・セットに関連付けられた長さセマンティクスを使用して、文字列の長さが文字数単位で計算されます。表9-3に、LIKE2
、LIKE4
およびLIKEC
の各条件を示します。
表9-3 LIKE条件
関数 | 説明 |
---|---|
文字がUCS-2のセマンティクスで表される場合に使用します。補助文字は2文字とみなされます。 |
|
文字がUCS-4のセマンティクスで表される場合に使用します。補助文字は1文字とみなされます。 |
|
文字が完全なUnicodeキャラクタ・セマンティクスで表される場合に使用します。合成文字は1文字として処理されます。 |
LIKEB
条件はありません。
2つのSQL関数NLS_CHARSET_NAME
およびNLS_CHARSET_ID
で、キャラクタ・セットID番号とキャラクタ・セット名の間の変換ができます。これらの関数は、OCIを介して変数をバインドするために、キャラクタ・セットID番号の判断が必要なプログラムで使用されます。
もう1つのSQL関数NLS_CHARSET_DECL_LEN
は、列のバイト単位の長さが指定されている場合、列の宣言の長さを文字数で戻します。
この項の内容は、次のとおりです。
関連項目: 『Oracle Database SQL言語リファレンス』 |
NLS_CHARSET_NAME
(n
)関数は、ID番号n
に対応するキャラクタ・セットの名前を戻します。n
がキャラクタ・セットIDとして認識されない値である場合、関数はNULL
を戻します。
NLS_CHARSET_ID
(text
)は、text
によって指定された名前に対応するキャラクタ・セットIDを戻します。text
には、ランタイムVARCHAR2
の値としてキャラクタ・セット名が定義されます。text
の値は、データベース・キャラクタ・セットまたは各国語キャラクタ・セット以外のキャラクタ・セットに解決されるNLSRTL
名にすることができます。
値CHAR_CS
をtext
に入力すると、この関数はサーバーのデータベース・キャラクタ・セットIDを戻します。値NCHAR_CS
をtext
に入力すると、この関数はサーバーのデータベース・キャラクタ・セットIDを戻します。text
が名前として認識されない場合、この関数はNULL
を戻します。
注意: text の値は、大文字で入力してください。 |
NLSSORT
関数では、ORDER BY
句に言語ソートを使用できます。文字列は言語ソート・メカニズムで使用される等価のソート文字列で置換されるため、置換文字列をソートして必要なソート基準を生成できます。バイナリ・ソートの場合、ソート文字列は入力文字列と同じです。
ORDER BY
句で使用される言語ソートの種類はNLS_SORT
セッション・パラメータによって決定されますが、NLSSORT
関数を明示的に使用することでオーバーライドできます。
例9-1では、NLS_SORT
セッション・パラメータを使用したドイツ語ソートを指定しています。
例9-1 NLS_SORTセッション・パラメータを使用したドイツ語ソートの指定
ALTER SESSION SET NLS_SORT = GERMAN; SELECT * FROM table1 ORDER BY column1;
例9-2 NLSSORT関数を使用したフランス語ソートの指定
この例では、最初にNLS_SORT
セッション・パラメータをGERMANに設定しますが、NLSSORT
関数でフランス語ソートを指定することでオーバーライドします。
ALTER SESSION SET NLS_SORT = GERMAN; SELECT * FROM table1 ORDER BY NLSSORT(column1, 'NLS_SORT=FRENCH');
WHERE
句では、NLS_COMP
がBINARY
に設定されている場合、バイナリ比較が使用されますが、これはWHERE
句にNLSSORT
関数を使用してオーバーライドできます。
例9-3 WHERE句を使用した言語上の比較
ALTER SESSION SET NLS_COMP = BINARY; SELECT * FROM table1 WHERE NLSSORT(column1, 'NLS_SORT=FRENCH')> NLSSORT(column2, 'NLS_SORT=FRENCH');
NLS_COMP
セッション・パラメータをLINGUISTIC
に設定すると、WHERE
句にはNLS_SORT
値が使用されます。
これ以降の内容は、次のとおりです。
NLSSORT
は、次の4通りの方法で使用できます。
NLSSORT()
(NLS_SORT
パラメータに従います。)
NLSSORT(column1, 'NLS_SORT=
xxxx
')
NLSSORT(column1, 'NLS_LANG=
xxxx
')
NLSSORT(column1, 'NLS_LANGUAGE=
xxxx
')
NLSSORT
関数のNLS_LANG
パラメータは、クライアント環境設定のNLS_LANG
とは異なります。NLSSORT
関数では、NLS_LANG
によって言語の略称(米語はUS
、ポーランド語はPL
など)が指定されます。次に例を示します。
SELECT * FROM table1 ORDER BY NLSSORT(column1, 'NLS_LANG=PL');
NLSSORT
によって、アプリケーションは、アルファベットの規則に従った文字列の一致を実行できます。通常、WHERE
句の文字列は、文字のバイナリ値を使用して比較されます。データベース・キャラクタ・セットでのバイナリ値が大きい場合、その文字は他の文字よりも大きいとみなされます。文字のバイナリ値に基づいた文字順が言語のアルファベット順と一致しない場合があるため、このような比較では、アルファベットの規則に従わないことがあります。たとえば、列(column1
)にISO 8859-1の8ビット・キャラクタ・セットの値ABC、ABZ、BCDおよびÄBCが含まれている場合、Ä
の数値はB
より大きいため、次の問合せではBCD
とÄBC
の両方が戻されます。
SELECT column1 FROM table1 WHERE column1 > 'B';
Ä
は、ドイツ語ではアルファベット順でB
の前にソートされますが、スウェーデン語ではÄ
は、Z
の後にソートされます。WHERE
句でNLSSORT
を使用すると、次のように言語上の比較を行うことができます。
WHERE NLSSORT(col)comparison_operator
NLSSORT(comparison_string
)
NLSSORT
は、比較演算子の両側に指定する必要があります。次に例を示します。
SELECT column1 FROM table1 WHERE NLSSORT(column1) > NLSSORT('B');
ドイツ語の言語ソートが設定されている場合、ドイツ語ではアルファベット順でÄ
はB
の前にくるため、この文ではÄ
で始まる文字列は戻されません。スウェーデン語の言語ソートが設定されている場合、スウェーデン語ではアルファベット順でÄ
はZ
の後にくるため、Ä
で始まる文字列が戻されます。
デフォルトでは、WHERE
句またはPL/SQLブロックでの比較はバイナリで行われます。言語上の比較にNLSSORT
関数を使用するのは、特にNLS_SORT
セッション・パラメータにすでに言語ソートが指定されている場合は、面倒な場合があります。NLS_COMP
パラメータを使用すると、WHERE
句またはPL/SQLブロックでの比較に、NLS_SORT
セッション・パラメータに従った言語を使用するように指定できます。
言語ソートを使用中の場合、ORDER BY
句では文字データに対して暗黙的なNLSSORT
が使用されます。ORDER
BY
句のソート方法(言語またはバイナリ)は、アプリケーション側で意識することはありません。ただし、NLSSORT
関数がORDER
BY
句に明示的に指定されている場合、暗黙的なNLSSORT
は実行されません。
NLS_SORT
セッション・パラメータで言語ソートが定義されている場合、アプリケーションではORDER BY
句に暗黙的なNLSSORT
関数が使用されます。明示的なNLSSORT
関数を指定すると、暗黙的なNLSSORT
関数がオーバーライドされます。
ソート方法が言語として定義されている場合、通常、ORDER
BY
句にNLSSORT
関数は不要です。
ソート方法がデフォルトであるか、バイナリとして定義されている場合、次のような問合せではバイナリ・ソートが使用されます。
SELECT last_name FROM employees ORDER BY last_name;
次の問合せによって、ドイツ語の言語ソートを取得できます。
SELECT last_name FROM employees ORDER BY NLSSORT(last_name, 'NLS_SORT = GERMAN');
この項の内容は、次のとおりです。
関連項目: 書式マスクの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
TO_CHAR
、TO_DATE
およびTO_NUMBER
の各関数には、複数の書式マスクが用意されています。
RM
(Roman Month)書式要素は、ローマ数字で月を戻します。RM
またはrm
を使用して、大文字または小文字を指定できます。たとえば、2007年9月7日の場合、DD-rm-YYYY
では07-ix-2007
が戻り、DD-RM-YYYY
では07-IX-2007
が戻ります。
書式マスクMON
およびDY
は、長さ3文字以内の月および曜日の略称を明示的にサポートします。たとえば、フランス語のLundiとMardiに対して、それぞれの略称LuとMaを指定できます。
WW
書式マスクで戻される週番号は、アルゴリズムint(dayOfYear+6)/7
に従って算出されます。この週番号のアルゴリズムは、ISO規格(2015、1992-06-15)に従っていません。
ISO規格をサポートするために、IW
書式要素が用意されています。これによりISOの週番号が戻されます。また、Y
、YY
、YYY
およびYYYY
の各書式要素の動作と同等の書式要素I
、IY
、IYY
およびIYYY
は、ISO週番号に関連する年を戻します。
ISO規格では、ISO週番号に関連する年が、暦年と異なることがあります。たとえば、2007年1月1日は、2008年のISO週番号53になります。週は、常に月曜日に始まって日曜日に終わります。週番号は、次の規則に従って決定されます。
1月1日が金曜日、土曜日または日曜日の場合、1月1日を含む週は、その週の大半の日が前年に属するため、前年の最後の週になります。
1月1日が月曜日、火曜日、水曜日または木曜日の場合は、1月1日を含む週は、その週の大半の日が新しい年に属するため、新しい年の最初の週になります。
たとえば、1991年1月1日は火曜日であるため、1990年12月31日の月曜日から1991年1月6日の日曜日までが第1週になります。したがって、1990年12月31日のISO週番号および年は、1および1991となります。ISO週番号を取得するには、週番号にIW
書式マスクを使用し、年にIY
書式のいずれかを使用します。
数値を書式設定するための書式要素がいくつか用意されています。
要素 | 説明 | 用途 |
---|---|---|
D |
小数 | 小数点文字を戻します。 |
G |
グループ | グループ・セパレータを戻します。 |
L |
各国通貨 | 各国通貨記号を戻します。 |
C |
国際通貨 | ISO通貨記号を戻します。 |
RN |
ローマ数字 | 数値を同等のローマ数字として戻します。 |
ローマ数字の場合は、RN
またはrn
を使用して、大文字または小文字のいずれかを指定できます。変換される数値は、1から3999の範囲の整数であることが必要です。
DBMS_LOB
PL/SQLパッケージを使用すると、外部BFILE
データをLOB
列にロードできます。Oracleデータベースでは、バイナリ・データをCLOB
列またはNCLOB
列にロードする前に、キャラクタ・セットの変換を行います。したがって、正常に動作させるために、BFILE
データをデータベース・キャラクタ・セットまたは各国語キャラクタ・セットと同じキャラクタ・セットにする必要はありません。各APIによって、指定したBFILE
キャラクタ・セットから、CLOB
データ型の場合はデータベース・キャラクタ・セット、NCLOB
データ型の場合は各国語キャラクタ・セットへとデータが変換されます。クライアント上ではBFILE
データはサポートされないため、ロードはサーバー上で発生します。