ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3.6 SQLモジュール言語プロセッサ・コマンドライン

記号を定義することにより、SQLモジュール・プロセッサを起動しやすくなります。次に例を示します。


$ SQLMOD == "$SQL$MOD"

モジュール・ファイル仕様の有無にかかわらず、SQLモジュール・プロセッサを起動できます。

いずれの方法でも、SQLプロセッサによるモジュール・ファイルの処理方法を制御するいくつかの修飾子を、ファイル仕様とともに指定できます。次の構文図は、これらの修飾子の形式を示しています。


形式













引数

ALIGN_RECORDS

NOALIGN_RECORDS

SQLモジュール・プロシージャのレコード・パラメータ内のフィールドを位置合せします。

OpenVMS Alphaプラットフォームを使用し、ホスト言語がCの場合、デフォルトはALIGN_RECORDSです。それ以外の場合、OpenVMS AlphaプラットフォームでのデフォルトはNOALIGN_RECORDSです。

C_PROTOTYPES=file-name

NOC_PROTOTYPES

この修飾子は廃止予定であり、将来のリリースではサポートされません。PROTOTYPES修飾子に置き換えられています。

C_STRING=[NO]BLANK_FILL

C_STRING=[NO]FIXED_CDD_STRINGS

C_STRING=([NO]BLANK_FILL,[NO]FIXED_CDD_STRINGS)

Cホスト言語文字列を処理する方法を指定します。

c-string-options

SQLでCホスト言語文字列を処理する方法を制御します。

C_STRING修飾子とともに[NO]BLANK_FILLキーワードと[NO]FIXED_CDD_STRINGSキーワードのいずれかまたは両方を使用して、C文字列の特性を制御します。

CONNECT

NOCONNECT

複数のユーザー・セッションを許可し、複数のモジュールにわたるグローバル・データベースにアクセスできるようにするかどうかを制御します。アプリケーション内のすべてのSQLモジュールは、接続が有効または無効の状態でコンパイルする必要があります。

デフォルトの設定はNOCONNECTです。

CONSTRAINT_MODE=IMMEDIATE

CONSTRAINT_MODE=DEFERRED

CONSTRAINT_MODE=ON

CONSTRAINT_MODE=OFF

必要に応じて、SQLモジュール言語のコマンドラインにCONSTRAINT_MODE=IMMEDIATEまたはCONSTRAINT_MODE=DEFERRED修飾子を指定して、コミット時の制約に対するデフォルトの制約評価モードを設定できます。(この修飾子は、動詞実行時の制約の評価には影響しません。)デフォルトはDEFERREDです。つまり、コミット時の制約はコミット時に評価されます。

制約にONを設定すると、SET ALL CONSTRAINTS OFF文が発行されるまで、またはトランザクションがコミット操作またはロールバック操作で完了するまでは、影響を受ける各制約はすぐに、および各文の終わりに評価されます。

SET ALL CONSTRAINTS文によって、CONSTRAINT_MODE=IMMEDIATE修飾子またはCONSTRAINT_MODE=DEFERRED修飾子がオーバーライドされます。

ANSI規格のSQLとの互換性が必要な場合は、制約をIMMEDIATEとして設定する必要があります。ただし、ほとんどの場合は、デフォルト設定(CONSTRAINT_MODE=DEFERRED)で十分です。

IMMEDIATEのかわりにONキーワードを、DEFERREDのかわりにOFFキーワードを使用できます。

CONTEXT=

特定の分散トランザクションのコンテキスト内でモジュール言語プロシージャを実行するよう、SQLモジュール・プロセッサに指示します。この修飾子を使用すると、プロシージャに対して追加のパラメータが生成され、プロシージャ内で最後に宣言されたパラメータとして配置されます。

CONTEXT=修飾子には、次のオプションを指定できます。

アプリケーションではコンテキスト構造体を使用して、ホスト言語プログラムから分散トランザクションに関連するモジュール内のプロシージャに、分散TIDのアドレスを渡す必要があります。コンテキスト構造体は、トランザクションがすでに開始されていて実行できないSQL文、またはDECdtmシステム・サービスが明示的にコールされていて使用できないSQL文以外の実行SQL文を含むプロシージャに渡します。第2.9節には、コンテキスト構造体を取得しない非実行可能文がリストされています。

また、CONTEXT修飾子を使用して、プロシージャに新しい名前を指定することもできます。

CONTEXT修飾子とともに使用する修飾子では、コンテキスト・パラメータを受け取るプロシージャ、およびそのプロシージャ名を変更するかどうかを指定します。

分散トランザクションではバッチ更新トランザクションを使用できないため、バッチ更新トランザクションを開始する前にSQL$DISABLE_CONTEXT論理名をTRUEに定義する必要があります。(分散トランザクションでは、トランザクションがロールバック可能であることが必要です。バッチ更新トランザクションではリカバリ・ユニット・ジャーナル・ファイル(.ruj)への書込みが行われないため、ロールバックできません。)

バッチ更新トランザクションを使用して分散トランザクションの開始を試行した場合の結果は、次に示すように、DECdtmシステム・サービスのコールを暗黙的または明示的のどちらで行うか、およびトランザクションの開始に何のSQL文を使用するかによって異なります。

2フェーズ・コミットのプロトコルは分散トランザクションにのみ適用されます。分散トランザクションの詳細は、『Oracle Rdb7 Guide to Distributed Transactions』を参照してください。

context-file-name

context-file-nameは、プログラムのコンパイルおよび実行時に適用するDECLARE文を含むSQLコマンド・プロシージャです。context-file-nameの詳細は、第2.11節を参照してください。

database-options

指定したデータベース型にアクセスするためのプログラムがSQLモジュール・プロセッサによって処理されるよう指定します。

データベース・オプションの詳細は、第2.10節を参照してください。

DEPRECATE

NODEPRECATE

DEPRECATE修飾子およびNODEPRECATE修飾子を使用して、廃止予定の機能に関する診断メッセージをSQLモジュール・プロセッサによって書き込むかどうかを指定します。

廃止予定の機能とは、現在は使用可能ですがSQLの将来のバージョンでは使用できなくなる機能、つまり、旧式の機能です。たとえば、廃止予定の機能の1つに、VERB TIMEではなくVERB_TIMEなどの旧式のキーワードを使用する機能があります。廃止予定の機能の完全なリストは、対話型SQLのヘルプ・ユーティリティによってオンラインで表示されます。

廃止予定の機能に関するメッセージ以外のすべての警告メッセージを表示する必要がある場合、WARN=WARNING修飾子を指定できます。廃止予定の機能に関するメッセージのみを表示する必要がある場合、WARN=(NOWARNING, DEPRECATE)修飾子を指定できます。WARN修飾子は単独では、情報メッセージ、警告メッセージおよび廃止予定の機能に関するメッセージを書き込むWARN=(WARNING, DEPRECATE)修飾子に相当します。NOWARN修飾子は単独では、どのメッセージも書き込まないWARN=(NOWARNING, NODEPRECATE)修飾子に相当します。

EXTERNAL_GLOBALS

NOEXTERNAL_GLOBALS

別名参照を強制的に別名定義として処理するかどうかを指定します。別名定義は、DECLARE ALIAS文でGLOBALキーワード(デフォルト)を使用して宣言された別名です。別名参照は、DECLARE ALIAS文でEXTERNALキーワードを使用して宣言された別名です。

EXTERNAL_GLOBALS修飾子により、別名参照は別名定義として処理されます。この修飾子は、V7.0より前のバージョンとの互換性を提供します。

NOEXTERNAL_GLOBALS修飾子により、別名参照は別名参照として処理されます。アプリケーションによって複数の共有可能なイメージ間で別名が共有される場合、OpenVMSではNOEXTERNAL_GLOBALS修飾子が便利です。

デフォルトの設定はEXTERNAL_GLOBALSです。

別名定義と別名参照の詳細は、「DECLARE ALIAS文」を参照してください。別名と共有可能イメージの使用方法の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。

FLAG_NONSTANDARD

FLAG_NONSTANDARD=SQL92_ENTRY

FLAG_NONSTANDARD=SQL89

FLAG_NONSTANDARD=MIA

NOFLAG_NONSTANDARD

SQLで非標準構文が識別されるかどうかを指定します。非標準構文は拡張機能と呼ばれ、ANSI/ISO SQL規格またはマルチベンダー・インテグレーション・アーキテクチャ(MIA)規格の一部ではない構文を示します。次のオプションを指定できます。

拡張機能の通知の防止(NOFLAG_NONSTANDARD)がデフォルトです。

FLOAT=D_FLOAT

FLOAT=G_FLOAT

FLOAT=IEEE_FLOAT

/FLOAT修飾子によって、単精度浮動小数点または倍精度浮動小数点のSQLデータ型として宣言されているSQLモジュール言語プロシージャ・パラメータの、SQLモジュール言語による変換方法が決まります。SQLの浮動小数点データ型には、FLOAT(n)、REALおよびDOUBLE PRECISIONがあります。詳細は、第2.3節を参照してください。Oracle Rdb内部では、単精度浮動小数点型はF浮動小数点として表され、倍精度浮動小数点型はG浮動小数点として表されます。詳細は、表3-2を参照してください。

デフォルトでは、単精度浮動小数点型または倍精度浮動小数点型として宣言されたパラメータは、コール側ホスト言語プログラムによって、それぞれF浮動小数点形式およびG浮動小数点形式で渡されます。これは、SQL$MODコマンドで/FLOAT=G_FLOAT修飾子を使用することと同じです。

SQL$MODのコマンドラインで/FLOAT=D_FLOATが指定されると、単精度浮動小数点型および倍精度浮動小数点型のパラメータは、それぞれF浮動小数点形式およびD浮動小数点形式に変換されます。SQLモジュール言語では、倍精度のパラメータは入力と出力の両方において、D浮動小数点形式およびG浮動小数点形式の間で変換されます。

SQL$MODのコマンドラインで/FLOAT=IEEE_FLOATが指定されると、単精度浮動小数点型および倍精度浮動小数点型のパラメータは、それぞれIEEE S浮動小数点形式およびIEEE T浮動小数点形式に変換されます。SQLモジュール言語では、入力と出力の両方において、これらの形式および内部のF浮動小数点形式とG浮動小数点形式の間で変換されます。

SQLモジュール言語プロシージャのパラメータがレコード型の場合、レコードの浮動小数点型のフィールドは、前述の説明と同じルールに従います。

ホスト言語プログラムの実パラメータの浮動小数点形式は、SQLモジュール言語の実パラメータの形式と一致する必要があります。(実パラメータおよび仮パラメータの一致の詳細は、第3.5節を参照してください。)

注意

Oracle Rdbでは、それぞれF浮動小数点(F_FLOAT)およびG浮動小数点(G_FLOAT)と呼ばれるVAX 32ビット型とVAX 64ビット型を使用して、浮動小数点数が内部的に格納されます。つまり、ホスト言語プログラムでIEEE形式が使用される場合、VAX形式とIEEE形式間で変換が行われます。VAX形式とIEEE形式では、小数部と指数で使用可能なビット数が異なります。また、IEEE形式には、無限値用に予約されている特定の指数値があります。これらの相違が原因で、変換プロセス中に浮動小数点のオーバーフローやアンダーフローおよび丸めエラーが発生する可能性があります。VAX浮動小数点形式とIEEE浮動小数点形式での最大値と最小値のデータの詳細は、OpenVMSオペレーティング・システム・ドキュメントの『Portable Mathematics Library』の付録Aを参照してください。

/FLOAT=IEEE_FLOATが使用されている場合、浮動小数点データ型は共通データ・ディクショナリからインポートされない場合があります。

G_FLOAT

NOG_FLOAT

/G_FLOAT修飾子と/NOG_FLOAT修飾子は、下位互換性を確保するためのものです。これらの修飾子はそれぞれ、/FLOAT=G_FLOATと/FLOAT=D_FLOATに相当します。/FLOAT修飾子と/[NO]G_FLOAT修飾子の両方は指定しないでください。

INITIALIZE_HANDLES

NOINITIALIZE_HANDLES

別名定義を強制的に別名参照として処理するかどうかを指定します。NOINITIALIZE_HANDLES修飾子を使用すると、すべての別名宣言が別名参照として処理されます。

別名定義は、DECLARE ALIAS文でGLOBALキーワード(デフォルト)を使用して宣言された別名です。別名参照は、DECLARE ALIAS文でEXTERNALキーワードを使用して宣言された別名です。

NOINITIALIZE_HANDLES修飾子は、OpenVMSにおいて既存のソース・コードで別名定義を強制的に別名参照として処理するときに便利です。OpenVMSでは通常、定義と参照は区別されないため、別名参照が必要なときにアプリケーションで別名定義を宣言できます。別名を共有する複数のイメージにアプリケーションを再編成する場合、別名定義と別名参照を区別する必要があります。この場合、NOINITIALIZE_HANDLES修飾子を使用して、ソース・コードを変更せずに定義を強制的に参照として処理します。

アプリケーションでEXTERNALキーワードを使用して別名参照が正しく宣言された場合、[NO]INITIALIZE_HANDLESのかわりにNOEXTERNAL_GLOBALS修飾子を使用して、OpenVMSでデフォルトをオーバーライドし、別名参照が参照として正しく処理されるようにします。

デフォルトの設定はINITIALIZE_HANDLESです。この修飾子により、[NO]EXTERNAL_GLOBALS修飾子はオーバーライドされます。

この修飾子は、Oracle Rdbの以前のバージョンとの互換性を確保するために保持されます。V7.0以上の場合、[NO]EXTERNAL_GLOBALS修飾子を使用します。これにより、別名定義がより正確に制御されます。別名定義と別名参照の詳細は、「DECLARE ALIAS文」を参照してください。別名と共有可能イメージの使用方法の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。

LIST

NOLIST

元のモジュール・リストおよび処理中に生成されたエラー・メッセージを含むリスト・ファイルをSQLモジュール・プロセッサで作成するかどうかを決定します。また、作成する場合はその名前を決定します。デフォルトはNOLIST修飾子です。LIST修飾子を指定するときにファイル仕様を含めない場合、SQLモジュール・プロセッサによりファイル拡張子.lisを使用してモジュール・ソース・ファイルと同じ名前でリスト・ファイルが作成されます。

LOWERCASE_PROCEDURE_NAMES

NOLOWERCASE_PROCEDURE_NAMES

モジュール言語プロシージャ名を強制的に小文字にします。この修飾子により、SQLモジュール・プロシージャ名は小文字とみなされ、引用されたSQLモジュール・プロシージャの大文字はすべて小文字でオーバーライドされます。

デフォルトの設定はNOLOWERCASE_PROCEDURE_NAMESです。

MACHINE_CODE

NOMACHINE_CODE

Oracle Rdb for OpenVMS Alphaにおいて、リスト・ファイル(.lis)にマシン・コードを含めるかどうかを決定します。ただし、マシン・コードが含まれるリスト・ファイルを生成するには、LIST修飾子も指定する必要があります。

デフォルトはNOMACHINE_CODE修飾子です。

module-file-spec

SQLモジュール・ソース・ファイルのファイル仕様です。ソース・ファイルのデフォルトのファイル拡張子は.sqlmodです。

module-qualifiers-1

module-qualifiers-2

SQLモジュール・プロセッサのコマンドラインにオプションで適用できる一連の修飾子です。

no-qualifiers-1

no-qualifiers-2

接頭辞NOを追加すると、このグループの修飾子を否定できます。

OBJECT

NOOBJECT

ソース・ファイルのコンパイルによって致命的エラーが発生しないときにオブジェクト・ファイルを作成するかどうかを指定します。また、オブジェクト・ファイルを作成する場合、ファイルの名前も指定します。デフォルトはOBJECT修飾子です。OBJECT修飾子を指定するときにファイル仕様を含めない場合、ファイル拡張子.objを使用してソース・ファイルと同じ名前でオブジェクト・ファイルが作成されます。

OPTIMIZATION_LEVEL optimization_option

SQLモジュール言語プログラム内のすべての問合せを処理するために使用されるオプティマイザ計画を指定します。選択可能なオプションは、次のとおりです。

TOTAL_TIMEオプションまたはFAST_FIRSTオプションは、AGGRESSIVE_SELECTIVITYオプションまたはSAMPLED_SELECTIVITYオプションとともに選択できます。キーワードを区切るにはカンマを使用し、リストは丸カッコで囲みます。

次の例は、OPTIMIZATION_LEVEL修飾子の使用方法を示しています。


$ SQL$MOD/OPTIMIZATION_LEVEL=(TOTAL_TIME,SAMPLED_SELECTIVITY) APPCODE.SQLMOD

OPTIMIZE WITH句またはOPTIMIZE_FOR句が明示的に含まれる問合せは、OPTIMIZATION_LEVEL修飾子を使用して確立された設定の影響は受けません。

最適化レベル修飾子は、静的SQL問合せのオプティマイザ計画を変更するために使用します。ただし、OPTIMIZATION_LEVEL修飾子によって設定されたデフォルトのオプティマイザ計画は、最上レベルのSELECT文に設定されたデフォルトのオプティマイザ計画によってオーバーライドできます。

一方、SET OPTIMIZATION LEVEL文の場合は、動的SQL問合せのコンパイルのみに関する問合せ最適化レベルを指定します。この文は、SQLのコンパイル時の環境や静的問合せの実行時環境には影響しません。

PACKAGE_COMPILATION

NOPACKAGE_COMPILATION

パッケージ仕様をACSライブラリ内に作成およびロードするかどうかを決定します。

NOPACKAGE_COMPILATION修飾子を指定せずに、モジュール・ヘッダーにLANGUAGE ADA句を指定してモジュールを処理すると、Oracle Rdbでパッケージ仕様が作成されます。NOPACKAGE_COMPILATION修飾子を指定すると、パッケージ仕様はACSライブラリにロードされません。ただし、.adaファイルの作成およびコンパイルが実行されます。

デフォルトはPACKAGE_COMPILATION修飾子です。

PARAMETER_CHECK

NOPARAMETER_CHECK

プロシージャに宣言された仮パラメータの数とプロシージャのSQL文で指定されているパラメータの数をSQLモジュール・プロセッサで比較するかどうかを指定します。

デフォルトでは、パラメータ数がチェックされます。モジュールのコンパイル時間を短縮するには、NOPARAMETER_CHECK修飾子を明示的に使用する必要があります。

PASSWORD_DEFAULT=password

コンパイル時のユーザーのパスワードを指定します。

DECLARE ALIAS文のUSING DEFAULT句を使用する場合、この修飾子を使用して、コンパイル時のユーザーのパスワードをプログラムに渡します。

PROTOTYPES[=prototypesfile]

NOPROTOTYPES

PROTOTYPES修飾子では、モジュールのLANGUAGE句を使用して、C(C++)、PascalおよびBLISSの各言語に対するルーチン宣言が生成されます。その他すべての言語値に対しては、この修飾子は無視されます。

プロトタイプ・ファイル仕様のデフォルトは、モジュール言語ソースと同一のデバイス、ディレクトリおよびファイル名です。ファイル・タイプのデフォルトは、Cの場合は.h、Pascalの場合は.PAS、およびBLISSの場合は.REQです。

BLISS言語では、PROTOTYPES修飾子によって、各SQLモジュール言語プロシージャに対するEXTERNAL ROUTINE宣言が生成されます。

Pascal言語では、生成された外部プロシージャ宣言はPascalプログラムまたはモジュールに含めることに適しています。SQLモジュール言語プロシージャで使用される構造化型(RECORD ... END RECORD)、SQLDA、およびSQLCAは、これらの外部定義を経由した構造体の受渡しを簡易化するために、UNSAFEバイト配列として宣言されます。ただし、この宣言の形式ではPascalの強力な型チェックが無効になるため、注意する必要があります。

C言語に対する出力にはプリプロセッサ・ディレクティブが含まれ、条件付きでC++のextern C構文を含んだり、複数の#include参照を使用できます。

デフォルトの設定はNOPROTOTYPESです。

QUERY_CPU_TIME_LIMIT=total-seconds

問合せの実行を最適化するために必要なCPUタイムの合計を制限します。問合せが最適化されておらず、CPUタイムの制限に達するまでに実行の準備が整わない場合、エラー・メッセージが返されます。

デフォルトでは、問合せのコンパイル時間に制限はありません。動的SQLオプションは、コンパイル修飾子から継承されます。

QUERY_ESTIMATES

NOQUERY_ESTIMATES

SQLCA構造体の推定行数および推定ディスクI/O操作数を返すかどうかを指定します。デフォルトのQUERY_ESTIMATES修飾子を指定すると、SQLCA.SQLERRD[2]フィールドに推定行数が返され、SQLCA.SQLERRD[3]フィールドに推定ディスクI/O操作数が返されます。通常、SQLCA.SQLERRD[2]およびSQLCA.SQLERRD[3]の値は、表に対してOPEN文を実行した後は0です。

次の例は、INTRO_PERSONNELデータベースにアクセスする文による対話型SQLの出力を示しています。このデータベースは、モジュール言語のコマンドラインでQUERY_ESTIMATES修飾子を指定したサンプル・プログラムSQL$INTRO_LOAD_EMPL_C.SQLMODを使用してロードされています。SQLCA.SQLERRD[2]フィールドは、推定行数が100行であることを示しています。SQLCA.SQLERRD[3]フィールドは、推定ディスクI/O操作数が16であることを示しています。


$ SQL$
SQL> ATTACH 'FILENAME intro_personnel';
SQL> DECLARE MY_CURSOR
cont> TABLE CURSOR FOR
cont> SELECT * FROM EMPLOYEES;
SQL> OPEN MY_CURSOR;
SQL> SHOW SQLCA;
SQLCA:
        SQLCAID:        SQLCA           SQLCABC:        128
        SQLCODE:        0
        SQLERRD:        [0]: 0
                        [1]: 0
                        [2]: 100
                        [3]: 16
                        [4]: 0
                        [5]: 0
        SQLWARN0:               SQLWARN1:               SQLWARN2:
        SQLWARN3:               SQLWARN4:               SQLWARN5:
        SQLWARN6:               SQLWARN7:

QUERY_MAX_ROWS=total-rows

問合せ処理時に返されるレコード数を制限します。この場合、問合せで返される行数がカウントされ、問合せが指定した合計行数を超えるとエラー・メッセージが表示されます。

デフォルトでは、フェッチされるレコード数は制限されません。動的SQLオプションは、コンパイル修飾子から継承されます。

QUERY_TIME_LIMIT=total-seconds

問合せ処理時に返されるレコード数を制限します。この場合、問合せの処理に要する秒数がカウントされ、問合せが指定した合計秒数を超えるとエラー・メッセージが表示されます。

デフォルトでは、問合せのコンパイル時間に制限はありません。動的SQLオプションは、コンパイル修飾子から継承されます。

ROLLBACK_ON_EXIT

プログラムでSQLが終了するときに未処理のトランザクションをロールバックします。

OpenVMSのデフォルトでは、プログラムでSQLが終了するときに未処理のトランザクションはコミットされます。このため、変更をロールバックする必要がある場合は、この修飾子をコマンドラインに指定します。

TRANSACTION_DEFAULT=IMPLICIT

TRANSACTION_DEFAULT=DISTRIBUTED

NOTRANSACTION_DEFAULT

トランザクションを開始するタイミングとデフォルトの分散トランザクションの処理方法を指定します。次のオプションを指定できます。