SQL Engine Reference (v11)

ほかの特性

このセクションでは、SQL 文法のその他の特性について説明します。この章は、以下のセクションに分かれています。

テンポラリ ファイル

Pervasive PSQL は、指定されたクエリを処理するためにテンポラリ テーブルを生成する必要がある場合は、次の規則によって決定される場所にそのファイルを作成します。

まず、文字列キー値の PervasiveEngineOptions¥TempFileDirectory を Windows レジストリに手動で追加した場合、Pervasive PSQL は TempFileDirectory に指定されたパスを使用します。(レジストリの場所は、製品のビット アーキテクチャによって異なります。Pervasive PSQL 32 ビット サーバー版では、HKEY_LOCAL_MACHINE¥SOFTWARE¥ODBC¥ODBC.INI です。Pervasive PSQL 64 ビット サーバー版では、HKEY_LOCAL_MACHINE¥SOFTWARE¥Wow6432Node¥ODBC¥ODBC.INI です。)

レジストリ エントリを定義した場合、Windows プラットフォームでは、Pervasive PSQL は以下の順序でパスを使用します。

たとえば、TMP 環境変数が定義されていない場合、Pervasive PSQL は TEMP 環境変数、その次の環境変数という順序で使用します。

Linux ディストリビューションでは、Pervasive PSQL はサーバー プロセスの現在のディレクトリを使用します。TMP の使用を試みることはありません。

Pervasive PSQL はクエリの処理を完了すると、そのクエリの処理で必要となったすべてのテンポラリ ファイルを削除します。クエリが SELECT ステートメントの場合には、テンポラリ ファイルは結果セットがアクティブである間、つまり、結果セットが呼び出し元のアプリケーションによって解放されるまでは存在します。

テンポラリ ファイルはどのような場合に作成されるか

Pervasive PSQL は、メモリ内、ディスク上、および Btrieve(トランザクショナル インターフェイス)の 3 種類のテンポラリ ファイルを使用します。

メモリ内のテンポラリ ファイル

メモリ内のテンポラリ ファイルは以下の状況で使用されます。

ディスク上のテンポラリ ファイル

ディスク上のテンポラリ ファイルは以下の状況で使用されます。

Btrieve テンポラリ ファイル

Btrieve テンポラリ ファイルは以下の状況で使用されます。

Pervasive PSQL は、静的カーソル SELECT クエリで各ベース テーブルに Btrieve テンポラリ アプリケーションフィルを作成しません。その代わり、各ベース テーブルを MicroKernel を使用して開き、ファイルの静的な表現としてファイル内にページを予約します。静的カーソルを介して行われた変更は、そのカーソルからは見えません。

リテラル値を使った作業

Pervasive PSQL は、標準 ODBC のリテラル書式をすべてサポートしています。このセクションでは、最も一般的なリテラル書式の例をいくつか示します。

文字列値

文字列定数は、指定する文字列を一重引用符で囲むことによって、SQL ステートメント内に表記できます。文字列自体に含まれる一重引用符には、その文字の前にエスケープ文字として一重引用符を付ける必要があります。

最初の例では、文字列内に含まれるアポストロフィまたは一重引用符は、もう 1 つの一重引用符によってエスケープする必要があります。

SELECT * FROM t1 WHERE c1 = 'Roberta''s Restaurant' 
SELECT STREET FROM address WHERE city LIKE 'san' 

日付値

日付定数は、SQL ステートメント内に文字列として表記するか、ベンダー文字列に埋め込むことができます。最初のケースは SQL_CHAR 型の文字列として、ベンダー文字列表記は SQL_DATE 型の値として扱われます。これは変換時に重要になります。

Pervasive PSQL では、この関数で概説しているように、拡張 SQL 文法を一部サポートしています。

Pervasive PSQL では、'YYYY-MM-DD' という日付リテラル書式をサポートしています。

日付の年は 0 ~ 9999 の範囲が可能です。

次の 2 つのステートメントによって、開始日が 1995 年 6 月 5 日より後のすべての授業が返されます。

SELECT * FROM Class WHERE Start_Date > '1995-06-05' 
SELECT * FROM Class WHERE Start_Date > {d '1995-06-05'} 

時刻値

Pervasive PSQL では、'HH:MM:SS' という時刻リテラル書式をサポートしています。

時刻定数は、SQL ステートメント内に文字列として表記するか、ベンダー文字列に埋め込むことができます。文字列表記は SQL_CHAR 型の文字列として、ベンダー文字列表記は SQL_TIME 型の値として扱われます。

Pervasive PSQL では、この関数で概説しているように、拡張 SQL 文法を一部サポートしています。

次の 2 つのステートメントによって、class テーブルから、授業の開始時刻が 14:00:00 のレコードが取り出されます。

SELECT * FROM Class WHERE Start_time = '14:00:00' 
SELECT * FROM Class WHERE Start_time = {t '14:00:00'} 

タイムスタンプ値

タイムスタンプ定数は、SQL ステートメント内に文字列として表記するか、ベンダー文字列に埋め込むことができます。Pervasive PSQL では、文字列表記は SQL_CHAR タイプの文字列として、ベンダー文字列表記は SQL_TIMESTAMP タイプの値として扱われます。

Pervasive PSQL では、この関数で概説しているように、ODBC SQL 文法を一部サポートしています。

Pervasive PSQL では、'YYYY-MM-DD HH:MM:SS.MMM' というタイムスタンプ リテラル書式をサポートしています。

次の 2 つのステートメントによって、Billing テーブルから、ログの開始日時が 1996-03-28 の 17:40:49 のレコードが取り出されます。

SELECT * FROM Billing WHERE log = '1996-03-28 17:40:49' 
SELECT * FROM Billing WHERE log = {ts '1996-03-28 17:40:49'} 

日付演算

Pervasive PSQL では、加算または減算する日数が整数で、日付がベンダー文字列に埋め込まれている場合、その整数を日付に加算したり日付から減算したりできます(これは、日付について変換を実行するのと同じです)。

また、Pervasive PSQL では、ある日付を別の日付から減算して日数を計算することもできます。

SELECT * FROM person P, Class C WHERE p.Date_Of_Birth < ' 1973-
09-05' and c.Start_date > {d '1995-05-08'} + 30 

NULL 値を使った作業

Pervasive PSQL は NULL を未知の値として解釈します。したがって、2 つの NULL値を比較すると、等価とは見なされません。

WHERE NULL=NULL という評価式は False を返します。

バイナリ データを使った作業

次のシナリオについて考えてみましょう。t1 テーブルで c1 という名前が付けられた BINARY(4)列にリテラル値 '1' を挿入します。次に、SELECT * FROM t1 WHERE c1='1' というステートメントを入力します。

データベース エンジンは、データ入力に使用したものと同じバイナリ形式を用いてデータを取得できます。つまり、上記の SELECT の例は、リテラルの一致がなくても正しく動作し、値 0x01000000 を返します。


メモ

データベース エンジンは、挿入するバイナリ値の奇数桁の前に必ずゼロ('0')を追加します。たとえば、値 '010' を挿入する場合、値 '0x00100000' がデータ ファイルに保存されます。

現在、Pervasive PSQL はバイナリ定数を示す接尾辞 0x をサポートしていません。バイナリ定数は、一重引用符で囲んだ 16 進数の文字列になります。


この動作は、SQL Server の動作と同じです。

インデックスの作成

VARCHAR 型の列の最大サイズは、ヌル値が許可されない列では 254 バイト、ヌル値が許可される列では 253 バイトです。

CHAR 型の列の最大サイズは、ヌル値が許可されない列では 255 バイト、ヌル値が許可される列では 254 バイトです。

Btrieve の最大キー サイズは 255 です。列でヌル値が許可され、インデックスが作成されているとき、ヌル インジケーターの 1 バイトと、インデックス列の最大 254 バイトから、セグメント キーが作成されます。VARCHAR 型の列は、長さバイト(Btrieve lstring)またはゼロ終端バイト(Btrieve zstring)が予約され、有効な記憶データが 1 バイト少ない点が CHAR 型の列と異なります。

開いたテーブルを閉じる

SQLFreeStmt に SQL_CLOSE オプションを指定して呼び出すと、SQLState は変更されますが、hStmt が使用している開いたテーブルは閉じません。hStmt が現在使用しているテーブルを閉じるには、SQLFreeStmt に SQL_DROP オプションを指定して呼び出す必要があります。

次の例では、Emp と Dept のテーブルは開いたままになります。

SQLPrepare(hStmt, "SELECT * FROM Emp, Dept", SQL_NTS) 
SQLExecute(hStmt) 
SQLFetch until SQL_No_Data_Found 
SQLFreeStmt(hStmt, SQL_CLOSE) 

その次に SQLPrepare が hStmt で呼び出されたとき、前のステートメントで使用したテーブルが閉じられます。たとえば、次の呼び出しを実行すると、Emp と Dept の両方のテーブルは Pervasive PSQL によって閉じられます。

SQLPrepare(hStmt, "SELECT * FROM Customer",SQL_NTS) 

その後、次の呼び出しによって Customer テーブルを閉じます。

SQLFreeStmt(hStmt, SQL_DROP) 

並行性

データの適時性、つまり動的であるかスナップショットであるかは、クエリを実行した結果として並べ替えが行われるかどうかによって決まります。DISTINCTGROUP BY、または ORDER BY を使用するクエリでは、目的の順序を満たすインデックスがある場合を除き、一時的な並べ替えが行われます。

一時的な並べ替えが行われないクエリの場合、フェッチされるデータはデータ ファイルのデータです。一時的な並べ替えが行われるクエリの場合、フェッチされるデータはテンポラリ テーブルのデータです。テンポラリ テーブルは、元のデータ ファイルにある必要なデータから SQLExecute の実行時に作成されます。


メモ

一部の並べ替え操作(選択リストに長いデータ列が含まれる SELECT ステートメントや、GROUP BY が指定されている SELECT ステートメントなど)で、Pervasive PSQL はブックマークを使用する場合があります。この場合、ブックマークは SELECT ステートメント内で永続的であると想定しています。ブックマークで参照している行が別のアプリケーションによって更新されたり削除される場合があります。

このような状況を回避するために、アプリケーションでは SQLSetStmtOption を fOption = 1153 と vParam = 1 で呼び出して、並べ替えるテーブルに排他ロックを設定できます。


小数点の記号のカンマ

多くの地域では、浮動小数点数フィールド内で整数部と小数部を区切るのにカンマを使用します。たとえば、これらの地域は、1 と 2 分の 1 を数字で表すのに 1.5 ではなく 1,5 を使用します。

Pervasive PSQL はピリオド "." とカンマ "," の両方を小数点の記号としてサポートすることができます。Pervasive PSQL はオペレーティング システムの地域の設定に基づいて、ピリオドまたはカンマを使用する入力値を受け入れます。デフォルトでは、データベース エンジンはピリオドを使って値を表示します。


メモ

小数点の記号がピリオドでない場合、SQL ステートメントに指定する数値は引用符で囲む必要があります。


出力と表示のみについては、セッション レベルのコマンド SET DECIMALSEPARATORCOMMAを使用すれば、出力(たとえば、SELECT の結果)でカンマを区切り文字として使用するように指定できます。このコマンドは、データの入力や保存には影響しません。

クライアント/サーバーの考慮

小数点の記号としてカンマをサポートするかは、オペレーティング システムの地域の設定によります。クライアント オペレーティング システムとサーバー オペレーティング システムのどちらにも地域の設定があります。期待される動作は両方の設定に応じて変わります。

地域の設定の変更

小数点の記号の情報は、Windows オペレーション システムが動作しているマシンでのみ取得または変更できます。Linux の場合、小数点の記号はピリオドに設定されており、設定を修正することはできません。Linux サーバー エンジンをお持ちで、小数点の記号にカンマを使用したい場合は、必ずすべてのクライアント コンピューターが小数点にカンマを使用する地域に設定されていなければなりません。

Windows オペレーティング システムの地域の設定を変更するには、コントロール パネルからこの設定にアクセスします。地域の設定を変更したら、必ず Pervasive PSQL サービスを停止して、再度開始してください。これにより、データベース エンジンが変更された設定を使用できるようになります。

例 A - サーバーの地域が小数点の記号にカンマを使用する

クライアントの地域が小数点の記号にカンマ "," を使用する場合:

CREATE TABLE t1 (c1 DECIMAL(10,3), c2 DOUBLE) 
INSERT INTO t1 VALUES (10.123, 1.232) 
INSERT INTO t1 VALUES ('10,123', '1.232') 
SELECT * FROM t1 WHERE c1 = 10.123 
SELECT * FROM t1 FROM c1 = '10,123' 

上記の 2 つの SELECT ステートメントがクライアントから実行された場合、次の値が返されます。
10.123, 1.232 
10.123, 1.232 
 
SET DECIMALSEPARATORCOMMA=ON 
SELECT * FROM t1 FROM c1 = '10,123' 

上記の SELECT ステートメントが、表示用の小数点の記号を設定した後でクライアントから実行された場合は、次の値が返されます。
10,123, 1,232 

クライアントの地域が小数点の記号に "." を使用しており、次のステートメントが新しい接続から発行される場合(SET DECIMALSEPARATORCOMMA のデフォルトの動作):

CREATE TABLE t1 (c1 DECIMAL(10,3), c2 DOUBLE) 
INSERT INTO t1 VALUES (10.123, 1.232) 
INSERT INTO t1 VALUES ('10,123', '1.232') 
SELECT * FROM t1 WHERE c1 = 10.123 
SELECT * FROM t1 WHERE c1 = '10,123' 

上記の 2 つの SELECT ステートメントがクライアントから実行された場合、次の値が返されます。
10.123, 1.232 
10.123, 1.232 

例 B - サーバーの地域が小数点の記号にピリオドを使用する

クライアントの地域が小数点の記号にカンマ "," を使用する場合:

例 A のクライアントがカンマ "," を使用する場合と同様です。

クライアントの地域が小数点の記号にピリオド "." を使用する場合:

CREATE TABLE t1 (c1 DECIMAL(10,3), c2 DOUBLE) 
INSERT INTO t1 VALUES (10.123, 1.232) 
INSERT INTO t1 VALUES ('10,123', '1,232') -- 割り当てエラー 
SELECT * FROM t1 WHERE c1 = 10.123 
SELECT * FROM t1 WHERE c1 = '10,123' -- 割り当てエラー 

上記の最初の select ステートメントがクライアントから実行された場合、次の値が返されます。
10.123, 1.232 
 
SET DECIMALSEPARATORCOMMA=ON 
SELECT * FROM t1 FROM c1 = 10.123 

上記の SELECT ステートメントが、表示用の小数点の記号を設定した後で実行された場合は、次の値が返されます。
10,123, 1,232 

OEM から ANSI への変換サポート

アプリケーションは Pervasive PSQL を使用して、文字データを OEM 文字セットで保存または取得できると同時に、データを ANSI Windows 文字セットを使って操作および表示できるようになりました。Pervasive ODBC ドライバー トランスレーター DLL が、2 つの文字セット間で必要な変換をすべて行います。この機能は、DSN ごとにオン/オフを切り替えることができます。DSN セットアップ ダイアログ ボックスについては、エンジン DSN 用の詳細な接続属性を参照してください。

列名またはテーブル名に拡張 ASCII 文字を使用している場合、Pervasive PSQL Control Center および SQL Editor は OEM 文字を完全に認識します。データベースとやり取りする文字データは、OEM 文字セットと ANSI 文字セット間で正しく変換されます。

アプリケーションで SQLDriverConnect を使用してデータ ソースに接続する場合は、接続文字列オプション TRANSLATIONDLL=path_and_DLL_name を使って、トランスレーター DLL を指定することもできます。Pervasive のトランスレーター DLL の名前は、W32BTXLT.DLL です。

メモ:[OEM/ANSI 変換]オプションは、クライアント DSN またはローカル エンジン DSN にのみ使用できます。


グローバル変数

ビット演算子