6.1.1 SQLの記述形式
- 〈この項の構成〉
(1) 全般規則
サーバとしてXDM/RD E2を使用する場合,使用できるSQLの仕様はXDM/RD E2が規定する仕様に従います。
XDM/RD E2のSQL仕様は,「XDM/RD E2のSQL仕様」と「HiRDBプログラムのSQL仕様」があります。
HiRDBクライアントからのアクセスの場合,通常は「HiRDBプログラムのSQL仕様」で動作しますが,「XDM/RD E2のSQL仕様」で動作したい場合は,XDM/RD E2のRD環境定義文のHIRDB PROGRAM句にSQL SPECIFICATION XDMRDを指定します。
各仕様の違いの詳細については,マニュアル「VOS3 データマネジメントシステム XDM E2系 XDM/RD E2 SQLリファレンス」を参照してください。また,XDM/RD E2のRD環境定義文に関しては,マニュアル「VOS3 データマネジメントシステム XDM E2系 XDM/RD E2 使用の手引−RD環境定義文・空間起動制御文・運用コマンド編−」を参照してください。
なお,HiRDBクライアントを使用してXDM/RD E2をアクセスする形態とは,次の条件を満たす形態をいいます。
-
HiRDBクライアントでプリプロセスした埋込み型UAP
-
会話型SQL実行ユティリティ(pdsql)
-
HiRDBのODBCドライバを使用したODBC接続
HiRDBのODBCドライバを使用したODBC接続については,「ODBC対応アプリケーションプログラムからのXDM/RD E2アクセス」を参照してください。
-
HiRDBのJDBCドライバを使用したJDBC接続
HiRDBのJDBCドライバを使用したJDBC接続については,「JDBC対応アプリケーションプログラムからのXDM/RD E2アクセス」を参照してください。
-
HiRDBクライアントを経由してXDM/RD E2に接続するプログラムプロダクト
(2) SQLで使用できる文字
SQLで使用できる文字は,XDM/RD E2の規則に従います。ただし,クライアント側の文字コードが日本語EUCの場合,SQL文中にEUCコードセット3の外字((8F)16(xxxx)16の3バイトで表現される文字コード)を使用することはできません。なお,EUCコードセット3の外字をVARCHAR型などの変数に格納することはできます。
XDM/RD E2の規則で示されている「EBCDIKコード」および「KEISコード」は,クライアント側では次のような文字コードに対応します。
XDM/RD E2側の文字コード |
クライアント側の文字コード |
|
---|---|---|
シフトJIS |
日本語EUC |
|
EBCDIK |
JIS8 |
JIS8※ |
KEIS |
JIS |
EUCコードセット1 または EUCコードセット3 |
- 注※
-
半角カタカナはEUCコードセット2((8E)16(xx)16の2バイトで表現される文字コード)になります。
SQL文中には英小文字を指定できます。SQL文中に指定した英小文字は,XDM/RD E2の規則に従い,英小文字または英大文字として扱われます。また,HiRDBクライアントを使用してXDM/RD E2をアクセスする場合,実長が0バイトの可変長文字列,可変長混在文字列,または実長が0文字の可変長各国文字列を使用できます。
詳細についてはマニュアル「VOS3 データマネジメントシステム XDM E2系 XDM/RD E2 SQLリファレンス」を参照してください。
(3) 文字コード
XDM/RD E2接続機能を使用する場合に,クライアント側およびXDM/RD E2側で使用できる文字コードを次の表に示します。
実行環境 |
使用できる文字コード |
備考 |
---|---|---|
クライアント側※1 |
シフトJIS |
半角文字はJISX0201に準拠します。 全角文字はJISX0208に準拠します。 |
日本語EUC |
XDM/RD E2 09-01以降の場合に使用できます。 |
|
UTF-8※2 |
XDM/RD E2 10-01以降の場合に使用できます。 |
|
XDM/RD E2側 |
EBCDIK/KEIS |
表の列の文字集合がシフトJISの場合は,シフトJISのままで格納されます。 |
- 注※1
-
JDBCドライバ使用時は,環境変数LANGや環境変数PDLANGの指定値に関係なくシフトJISとなります。
- 注※2
-
NCHAR型,NVARCHAR型では使用できません。
また,クライアント側OSが使用できるロケールを次の表に示します。
文字コード |
ロケール |
|||
---|---|---|---|---|
HP-UX |
AIX |
Linux |
Windows |
|
sjis(シフトJIS漢字) |
ja_JP.SJIS |
Ja_JP |
− |
ja_JP.SJIS |
ujis(日本語EUC)※1 |
ja_JP.eucJP |
ja_JP |
ja_JP.eucJP, ja_JP※2, ja_JPujis※2 |
ja_JP.ujis |
UTF-8 |
− |
− |
− |
UTF-8 |
- (凡例)
-
−:使用できません。
- 注※1
-
XDM/RD E2 09-01以降の場合だけ使用できます。
- 注※2
-
ja_JPとja_JP.ujisは,ja_JP.eucJPの別名とみなされます。
(4) 文字コード変換
HiRDBクライアント側で使用する文字コードとXDM/RD E2側で使用する文字コードはXDM/RD E2で変換されます。文字コード変換によって,2バイトコードを含む文字列は長さが変わることがあるため,注意が必要です。
文字コードに関する注意事項の詳細については,「文字コードに関する注意事項」を参照してください。
文字コード変換規則の詳細については,マニュアル「VOS3 データマネジメントシステム XDM E2 系 XDM/RD E2 使用の手引−運用編−」を参照してください。
(5) 文字コードに関する注意事項
通常,XDM/RD E2側で使用できる文字コードはEBCDIK/KEISであり,クライアント側で使用できる文字コードはシフトJIS,日本語EUC,およびUTF-8です。
XDM/RD E2の文字集合機能を使用して文字集合をシフトJISにすれば,XDM/RD E2で扱うデータをシフトJISで扱えますが,文字集合をシフトJISにしない場合は,文字コードを変換する必要があります。
システムを構築する上で,文字コードを変換するときに注意しなければならない点を次に示します。
(a) データベース中の文字コードをEBCDIK/KEISにする場合
- (i)データ長の変化
-
KEISコードは,半角の文字(1バイトの文字)と全角の文字(2バイトの文字)を区別するために,シフトコードという制御コードを用います。シフトコードはデータ表示時には表示されませんが,データとして存在するため,見かけの文字長と実際のデータ長が異なります。一方,シフトJISと日本語EUCでは,シフトコードのような制御コードを持ちません。このため,文字コード変換によってデータの長さが変化する場合があります。
次に例を示します。
なお,ここではKEISコードへシフトするシフトコードを[漢],EBCDIKコードへシフトするシフトコードを[E]と表します。[漢]は0x0A42,[E]は0x0A41という2バイトのデータです。
ケース
シフトJISまたは日本語EUCでのデータ
EBCDIK/KEISでのデータ
半角文字だけの場合
(VARCHAR型)
'ABCD'
(4バイト)
'ABCD'
(4バイト)
全角文字だけの場合
(NVARCHAR型)
'あいう'
(6バイト)
'あいう'
(6バイト)
半角文字と全角文字が混在する場合
(MVARCHAR型)
'AあBいC'
(7バイト)
'A[漢]あ[E]B[漢]い[E]C'
(15バイト)
半角文字と全角文字が混在するデータの場合,シフトJISまたは日本語EUCのデータをEBCDIK/KEISに変換すると,最大7/3倍になります。
このため,混在文字データを扱う場合のシステムでは次のようにします。
-
表定義時の列の長さ
シフトJISまたは日本語EUCのデータ長の7/3倍以上で定義してください。
- (例)
-
UAPで100バイトの混在文字データを扱う場合,列の定義はMVARCHAR(100)ではなく,MVARCHAR(234)で定義します。
-
UAPで使用する埋込み変数
ある表のデータの追加・更新をXDM/RD E2接続機能だけを使用して行う場合は,その表にアクセスするSQLの埋込み変数を,その埋込み変数に対応する列の定義長の3/7倍の長さで定義してください。
- (例1)
-
「表定義時の列の長さ」の例の列に対してデータを挿入(INSERT)する場合の埋込み変数は,MVARCHAR(100)に対応する埋込み変数の定義をしてください。
C言語の場合は,次のようになります。
struct { short 変数名1 ; char 変数名2[100] ; } 構造体名 :
なお,可変長の場合は,実長(変数名1で示す長さ)が100バイト以下であれば,変数名2の長さは100バイトを超えていてもかまいません。また,EBCDIK/KEISに変換しても234バイト以下となるデータであれば,実長が100バイトを超えていてもかまいません。
しかし,シフトJISまたは日本語EUCで100バイトを超えるデータをデータベースに格納すると,検索時に100バイトの埋込み変数で受け取れなくなる場合があります。これを防止するため,挿入データに対応する埋込み変数の定義長は,100バイトにしておくことをお勧めします。
- (例2)
-
「表定義時の列の長さ」の例の列を検索(FETCH)する場合の埋込み変数は,MVARCHAR(100)に対応する埋込み変数の定義をしてください。
ただし,これはデータベース中に格納されているすべてのEBCDIK/KEISのデータが,シフトJISまたは日本語EUCに変換しても100バイト以下のデータである場合に限ります。
ある表のデータの追加・更新をXDM/RD E2接続機能以外の方法で行うことがある場合は,その表にアクセスするSQLの埋込み変数の長さは次のとおりにしてください。
対象列
処理
MVARCHAR型変数の長さ
シフトJISの場合
日本語EUCの場合
MCHAR(n)および
MVARCHAR(n)
検索
定義長=n
定義長=n×2
格納
実長≦n×(3/7)※
実長≦n×(3/7)※
- 注※
-
追加・更新するデータのEBCDIK/KEISでのバイト数がわからない場合の見積もりです。バイト数がわかる場合は,EBCDIK/KEISでのバイト数≦nになるようにしてください。
- (例3)
-
HiRDBクライアント以外を使用してデータの追加・更新を行うことがある表にMVARCHAR(100)の列が存在する場合は,この列を検索(FETCH)するときの埋込み変数は,3/7倍にするのではなく,次のようにしてください。
-
クライアントの文字コードがシフトJISの場合
MVARCHAR(100)に対応する埋込み変数の宣言としてください。これは,既存のデータベース中に1バイト文字だけ格納されている場合があるためです。
-
クライアントの文字コードが日本語EUCの場合
MVARCHAR(200)に対応する埋込み変数の宣言としてください。これは,既存のデータベース中に半角カタカナ文字だけ格納されている場合があるためです。半角カタカナはEBCDIK/KEISでは1文字が1バイトですが,日本語EUCでは1文字が2バイトになるので,EBCDIK/KEISのデータを日本語EUCに変換すると,最大2倍になります。
-
-
- (ii)固定長文字に対する考慮
-
全角文字を含むシフトJISまたは日本語EUCのデータをEBCDIK/KEISに変換すると,データ長が変化するため,全角文字を扱う場合は,固定長データ(MCHAR)ではなく可変長データ(MVARCHAR)とすることをお勧めします。
固定長データ(MCHAR)とする場合には,次の点に注意してください。
-
文字長の変化
(i)と同様に,挿入(INSERT)時などに使用する埋込み変数は,対応するデータの3/7倍にします。
代入先のデータ長が代入元より短い場合は,代入先に空白が補われます。
埋込み変数が3/7倍以上の場合は,次のような事象が発生します。
- (例)
-
C言語の埋込み型UAPであり,表の列の定義がMCHAR(234)の場合で,「INSERT INTO 表 VALUES(:埋込み変数)」としたときの結果を次に示します。
なお,'△'は半角の空白1文字を示し,'\0'はC言語のナル文字を示します。
埋込み変数の型
(C言語の場合)
埋込み変数のデータ
結果
char 変数名[235];
'ABCDEFG△△…△\0'
(空白は228個)
左記データが正しく格納される。
'あいうえお△△…△\0'
(空白は224個)
SQLCODE=-404エラー※
char 変数名[101];
'あいうえお△△…△\0'
(空白は90個)
左記データが正しく格納される。
- 注※
-
'あいうえお△△…△'(空白は224個)をEBCDIK/KEISに変換すると,'[漢]あいうえお[E]△△…△'(空白は224個)となり,長さが238バイトになります。その結果,挿入するデータ長が列の定義長を超えるため,エラーになります。
-
LIKE述語の比較
XDM/RD E2の固定長文字列に対する比較述語では,長さが異なるデータを比較する場合は,短い方に空白を補って比較します。しかし,LIKE述語に関しては空白を補いません。
このため,LIKE述語でパターン文字'%'(0文字以上の任意の文字)を使用しない場合は,比較するときに意図する検索ができない場合があります。
- (例)
-
表の列の型がMCHAR(234)であり,かつ格納されているデータが'ABCDEFG△△…△'と'あいうえお△△…△'である場合で,SELECT文の探索条件を「WHERE 値式 LIKE :埋込み変数」としたときの結果を次に示します。
なお,'△'は半角の空白1文字を示し,'\0'はC言語のナル文字を示します。
埋込み変数の型
(C言語の場合)
埋込み変数のデータ
「WHERE 値式 LIKE :埋込み変数」
の評価
char 変数名[235];
'ABCDEFG△△…△\0'
(空白は228個)
真
'ABCDEFG\0'
偽※1
'あいうえお△△…△\0'
(空白は224個)
偽
'あいうえお△△…△\0'
(空白は220個)
真※2
char 変数名[101];
'ABCDEFG△△…△\0'
(空白は93個)
偽
'ABCDEFG\0'
偽
'あいうえお△△…△\0'
(空白は90個)
偽
- 注※1
-
UAPがC言語で記述されている場合,データ中に'\0'が含まれていると,データ長を'\0'の一つ前までの長さとみなします。このため,「長さ7バイトのデータ'ABCDEFG'」とデータベースの「長さ234バイトのデータ'ABCDEFG△△△'」を比較します。
'%'を含まないLIKE述語は,長さが一致しなければ真とはならないため,この評価は「偽」となります。
- 注※2
-
半角文字だけを扱う場合は,埋込み変数に対応するSQLのデータ型のデータ長と同じ長さで埋込み変数を定義して,'%'を含まないLIKE述語を「真」にできます。
しかし,全角文字が含まれる場合は,EBCDIK/KEISに変換した後のデータ長を考慮したデータ長としなければなりません。
この例では,[漢]と[E]が付加されて4バイト大きくなるため,定義長(234バイト)よりも4バイト少なくなる位置に'\0'を埋め込みます。
-
- (iii)空白の扱い
-
空白には半角の空白と全角の空白があります。XDM/RD E2には,空白に関する変換規則について次に示すオプションがあります。このオプションは,XDM/RD E2のRD環境定義文で指定します。詳細については,マニュアル「VOS3 データマネジメントシステム XDM E2系 XDM/RD E2 使用の手引−RD環境定義文・空間起動制御文・運用コマンド編−」を参照してください。
- HALFSPACE
-
XDM/RD E2のRD環境定義文のCONVERT OPTION句にHALFSPACE HALFを指定することをお勧めします。
HALFSPACE HALFを指定すると,半角空白が2文字連続した場合の文字コードが次のように変換されます。
変換方向
変換前データ
変換後データ
HALFSPACE HALFを指定
HALFSPACEを省略
シフトJISまたは日本語EUC→
EBCDIK/KEIS
半角空白2文字
(0x2020)
半角空白2文字
(0x4040)
半角空白2文字
(0x4040)
EBCDIK/KEIS→
シフトJISまたは日本語EUC
半角空白2文字
(0x4040)
半角空白2文字
(0x2020)
全角空白1文字
(0x8140)
HALFSPACE HALFを指定することで,クライアント側から挿入した半角空白2文字を検索する場合,挿入した値を同じ値で検索できます。
- (iv)EUCコードセット3の外字の扱い
-
ここでは,クライアントの文字コードが日本語EUCの場合の,EUCコードセット3の外字の扱いについて説明します。
EUCコードセット3の外字を含むデータを,NCHARおよびNVARCHAR型の変数に格納すると正しく処理されません。これは,NCHARおよびNVARCHAR型の変数はデータ長をバイト数ではなく文字数で指定し,1文字が2バイトであることを前提にして処理されているためです。EUCコードセット3の外字は1文字が3バイトなので,正しく処理されません。
- (例1)
-
EUCコードセット3の外字コードを含むNCHARおよびNVARCHAR型の列を対象に検索,格納,比較を行う場合は,VARCHAR型またはCHAR型の変数を使用してください。EUCコードセット1の漢字(1文字が2バイト)とEUCコードセット3の外字が混在すると,文字数からデータのバイト数が確定しないので,NCHAR型(固定長)の列が対象の場合でもVARCHAR型(可変長)の変数を使用することをお勧めします。変数の長さは次のようになります。
対象列
処理
VARCHAR型変数の長さ
NCHAR(n)および
NVACHAR(n)
検索
定義長(バイト数)=n×3
格納
実長≦n×2※
注※ 格納するデータの文字数がわからない場合の計算です。文字数がわかる場合は,文字数≦nにしてください。
- (例2)
-
DESCRIBE文がSQL記述領域に設定したデータ型がNCHARおよびNVARCHAR型の場合に,EUCコードセット3の外字を含むデータを変数に格納するときは,SQL記述領域のデータ型をVARCHAR型に書き換えてください。
(b) データベース中の文字コードをシフトJISにする場合
CREATE TABLE文で表を定義する場合に,文字集合の指定でシフトJISを選択すると,データベースに格納する文字コードがシフトJISになります。
データベース中のデータがシフトJISの場合,文字コードを変換する必要がなくなるため,「(a) データベース中の文字コードをEBCDIK/KEISにする場合」の注意事項を考慮する必要がありません。
文字集合としてシフトJISを使用する場合のCREATE TABLE文の例を次に示します。
CREATE TABLE 表名 (列名 CHAR(100) CHARACTER SET SHIFT_JIS)
なお,文字集合をシフトJISにする場合は,次の点に注意してください。
- (i)VOS3上のUAPでの文字コード変換
-
WSやPCで動作するHiRDBクライアントのUAPでは文字コードを変換する必要がありませんが,VOS3上で動作するUAP(EBCDIK/KEISを使用するUAP)では文字コードを変換する必要があります。
このため,VOS3上のUAPを作成する上で,文字コードを変換するときに注意する必要があります。
- (ii)制限事項
-
XDM/RD E2側で文字集合とほかの機能の組み合わせが制限されている場合があります。次にXDM/RD E2 07-00での制限事項の一部を示します。その他の制限事項については,XDM/RD E2のマニュアルを参照してください。
-
文字集合シフトJISの列を分割表の分割条件列に指定できない。
-
文字集合シフトJISの列をインデクス除外値構成列に指定できない。
-
(6) SQLの最大長
一つのSQLの最大長は2,000,000バイトです。
ただし,最大長はDBコネクションサーバの空間起動制御文などに指定する「MAX SQL LENGTH」の指定によって制限されます。
詳細については,マニュアル「VOS3 データマネジメントシステム XDM E2系 XDM/RD E2 使用の手引−RD環境定義文・空間起動制御文・運用コマンド編−」を参照してください。
(7) 名前の指定
名前に使用できる文字を次の表に示します。
名前の種類 |
制限文字数 |
英大文字数字 |
英小文字 |
カナ文字 |
下線 |
空白 |
ハイフン |
全角文字だけの各国文字の使用可否 |
全角文字と半角文字の混在可否 |
---|---|---|---|---|---|---|---|---|---|
認可識別子 |
RD ※4 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
パスワード |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
スキーマ識別子 |
RD ※4 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
表識別子 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
列名 |
RD ※4 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
相関名 |
RD ※4 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
問合せ名 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
属性名 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
カーソル識別子 |
30バイト |
○ |
○ ※2 |
○ |
○ |
× |
○ ※3 |
○ |
○ |
SQL文識別子 |
30バイト |
○ |
○ ※2 |
○ |
○ |
× |
○ |
○ |
○ |
ホスト識別子※1 |
30文字 |
○ |
○ ※2 |
○ |
○ |
× |
○ |
○ |
○ |
SQLパラメタ名 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
リスト名 |
RD ※4 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
文ラベル |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
インデクス識別子 |
RD ※4 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
トリガ識別子 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
ルーチン識別子 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
特定化識別子 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
データ型識別子 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
制約名 |
RD ※4 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RDエリア名 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RDノード名称 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
dd名 |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
RD |
- (凡例)
-
- RD:
-
XDM/RD E2の仕様に従います。詳細については,マニュアル「VOS3 データマネジメントシステム XDM E2系 XDM/RD E2 SQLリファレンス」を参照してください。
- ○:
-
使用できます。名前の先頭の文字は,半角英大文字,半角英小文字,半角仮名大文字にしてください。ただし,全角文字を使用できる名前の先頭の文字は,全角文字にできます。
- ×:
-
使用できません。
- 注※1
-
ホスト言語によって制限されます。
- 注※2
-
半角英小文字は,半角英大文字として扱われます。ただし,引用符「"」で囲めば,区別して扱えます。
- 注※3
-
名前に半角ハイフンを含む場合には,引用符「"」で囲んでください。ただし,半角ハイフンを含むカーソル名は,手続きまたは関数の中に指定する場合だけ引用符「"」で囲んでください。
- 注※4
-
全角文字を使用すると,クライアントで使用している文字コード(シフトJISなど)からXDM/RD E2で使用する文字コード(KEISコード)に変換する際にデータ長が変わります。このため,制限文字数は変換後のバイト数で計算してください。文字コードに関する注意事項の詳細については,「文字コードに関する注意事項」を参照してください。
(8) 予約語
HiRDBの予約語にXDM/RD E2の予約語を加えたものが,SQLの予約語となります。
HiRDBの予約語については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。
XDM/RD E2の予約語については,マニュアル「VOS3 データマネジメントシステム XDM E2系 XDM/RD E2 SQLリファレンス」を参照してください。