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

戻る
戻る
 
次へ
次へ
 

3.2 SQLモジュール言語の構文

SQLモジュール言語では、SQLプリコンパイラによってサポートされていないホスト言語からSQL文を含むプロシージャをコールできるようにする、特別なキーワードおよび構文が提供されています。

環境

SQLモジュール言語要素は、SQLモジュール・ファイルの一部である必要があります。

形式




















引数

ALIAS alias-name

モジュールのデフォルトの別名を指定します。モジュールの別名を指定しない場合、デフォルトの別名はモジュールの認可識別子です。

FIPSフラガーが有効である場合、ALIAS句(単独で、またはAUTHORIZATION句とともに使用)は非標準構文としてフラグが付けられます。

アプリケーションが複数のモジュール間で参照する必要があるデータベースが1つのみの場合は、実行可能イメージを構成するためにリンクされるすべてのモジュールで、デフォルト・データベースに同じ別名を使用すると便利です。SQLプリコンパイラで処理されるモジュールがそのイメージに含まれる場合は、そのイメージのすべてのSQLモジュールのAUTHORIZATION句でRDB$DBHANDLEを指定する必要があります。これは、別名RDB$DBHANDLEでは、プリコンパイルされたSQLプログラムでデフォルト・データベースが常に指定されるためです。

AUTHORIZATION auth-id

モジュールの認可識別子を指定します。スキーマの認可識別子を指定しない場合、認可識別子はモジュールをコンパイルしているユーザーのユーザー名です。

ANSI/ISO SQL89規格に準拠する場合は、スキーマ名なしでAUTHORIZATION句を指定します。ANSI/ISO SQL99規格に準拠する場合は、AUTHORIZATION句とスキーマ名を指定します。

マルチスキーマ・データベースにアタッチする場合、各スキーマの認可識別子はモジュールをコンパイルしているユーザーのユーザー名です。この認可識別子はデフォルトの別名およびスキーマを定義します。ALIAS句とSCHEMA句を使用してデフォルトをオーバーライドできます。

単一スキーマ・データベースにアタッチするか、またはATTACH文またはDECLARE ALIAS文にMULTISCHEMA IS OFFを指定してAUTHORIZATION句とALIAS句の両方を指定した場合、モジュール・ファイル内でRIGHTS句を指定する場合を除き認可識別子はSQLによって無視されます。RIGHTS句によって、SQLでは権限チェックのモジュールAUTHORIZATION句に指定された認可識別子が使用されるようになります。この項の後半で説明するRIGHTS句を参照してください。

SQLモジュールのプロシージャが常に認可識別子で表名を修飾する場合、AUTHORIZATION句はプロシージャのSQL文には影響しません。

FIPSフラガーが有効である場合、AUTHORIZATION句の省略は非標準構文としてフラグが付けられます。

BY DESCRIPTOR

仮パラメータが、記述子によってコール側プログラム・モジュールに渡されることを指定します。BY DESCRIPTOR句は次の場合に便利です。

BY DESCRIPTOR句では、固定長フィールドであるOpenVMS静的記述子のみがサポートされています。

どの言語でも、SQLモジュール仮パラメータの受渡しメカニズムは、ホスト言語モジュールの実パラメータと同じである必要があります。

Ada、BASIC、C、FORTRAN、PascalおよびPL/Iでは、記述子によるレコードの受渡しはサポートされません。これらすべての言語の要素から記述子を構成して、構成した記述子を参照によってSQLモジュール言語に渡すことができます。

CATALOG catalog-name

モジュールのデフォルト・カタログを指定します。カタログとは、マルチスキーマ・データベース内のスキーマのグループのことです。マルチスキーマ・データベースでオブジェクトを指定する場合にカタログ名を省略すると、デフォルトのカタログ名RDB$CATALOGが使用されます。マルチスキーマ属性なしで作成されたデータベースにはカタログがありません。SET CATALOG文を使用すると、動的または対話型SQLの現在のデフォルトのカタログ名を変更できます。

CHARACTER LENGTH

文字列パラメータ、列およびドメインの長さを文字またはオクテットのどちらで解釈するかを指定します。言語がSQL89、SQL92、SQL99またはMIAに設定されている場合、デフォルトはCHARACTERSです。それ以外の場合、デフォルトはOCTETSです。

char-data-types

SQLでサポートされている文字データ型の詳細は、第2.3節を参照してください。

CHECK

実パラメータのデータ型、長さおよび記述子のスケールと、SQLモジュールのプロシージャ・パラメータに宣言された値を実行時に比較するように指定します。2つの値が一致しない場合は、エラーが返されます。CHECK句は、コール側ホスト言語モジュールから記述子によって渡されるパラメータでのみ使用できます。

コンパイル時にSQLモジュールとコール側ホスト言語プログラム・モジュールの間に接続が存在しないため、仮パラメータ宣言とモジュールに対するコールの実パラメータの間の一致を検証する方法はありません。CHECK句では、プログラムの実行時にこのような検証を実行できます。

仮パラメータ宣言でCHECK句を指定しない場合は、プロシージャとコール側パラメータが一致するとみなされます。一致していない場合は、予期しない結果が生じる可能性があります。ただし、次の場合は、CHECK句を使用しないことを選択できます。

CHECK句では、仮パラメータとコール・パラメータを比較するときに次のルールに従います。

異なる種類のOpenVMS引数記述子の詳細は、OpenVMSのプログラミング・ドキュメントを参照してください。

compound-statement

通常、複数の実行SQL文、関連する変数宣言、およびBEGIN...ENDブロック内の制御文を含みます。ただし、これらの引数はオプションです。たとえば、空のBEGIN...ENDブロック(BEGIN END;)を作成できます。

複合文が埋め込まれているプロシージャがホスト言語モジュールでコールされると、複合文が実行されます。複合文の詳細は、「複合文」を参照してください。

COMPOUND TRANSACTIONS INTERNAL

COMPOUND TRANSACTIONS EXTERNAL

複合文またはストアド・プロシージャを実行する前にトランザクションを開始するかどうかを指定できます。

COMPOUND TRANSACTIONS EXTERNAL句は、プロシージャを実行する前にトランザクションを開始するように指示します。COMPOUND TRANSACTIONS INTERNAL句は、プロシージャの実行による要求に応じて、プロシージャでトランザクションを開始するように指示します。

デフォルトでは、現在のトランザクションが存在しない場合、複合文を実行する前にトランザクションが開始されます。

data-type

文字データ型として定義されているパラメータのキャラクタ・セットを指定できます。次のルールに基づいてパラメータのキャラクタ・セットが想定されます。

INTEGERデータ型を除き、データ型およびキャラクタ・セットでのデータ型の修飾の詳細は、第2.3節および第3.5節を参照してください。次の引数では、SQLモジュール言語に関するINTEGERデータ型について記述します。

モジュールの仮パラメータに指定されるSQLデータ型は、実パラメータのホスト言語変数宣言のデータ型に相当する必要があります。仮パラメータと実パラメータが同じデータ型で宣言されていない場合は、予期しない結果が生じる可能性があります。第3.5節では、SQLデータ型に相当するホスト言語データ型を示し、同義のホスト言語データ型が存在しない場合にモジュール・プロシージャでデータ型を変換する方法について説明します。

データベース・キーのデータ型はCHAR(n)です。ここで、nはデータベース・キーのバイト数に相当します。データベース・キーの詳細は、第2.6.5項を参照してください。

date-time-data-types

frac

interval-qualifier

prec

seconds-prec

特定のデータ型およびその修飾子の詳細は、第2.3節を参照してください。

declare-statement

次の文のいずれかです。

SQLモジュールでは、モジュールのLANGUAGE句の後にすべてのDECLARE文をまとめて配置する必要があります。前述のすべてのDECLARE文はオプションです。

DECLARE TRANSACTIONを除くすべてのDECLARE文は繰り返すことができます。ただし、DECLARE CURSOR文ごとに、DECLARE CURSOR文に対応するOPEN文を含むプロシージャが1つのみSQLモジュールに存在している必要があります。

DECLARE文またはプロシージャ・セクションと宣言文セクションを区切るために記号は使用しないでください。

DEFAULT CHARACTER SET support-char-set

キャラクタ・セットによって修飾されず、各国語キャラクタ・データ型として定義されないパラメータのキャラクタ・セットを指定します。この句またはNAMES ARE句でキャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。この句は、NAMES ARE句で指定されたキャラクタ・セットをオーバーライドします。使用可能なキャラクタ・セットのリストは、第2.1節を参照してください。

DEFAULT DATE FORMAT

DATEデータ型またはCURRENT_TIMESTAMPデータ型を持つ列のデフォルトの解釈を制御します。DATEデータ型およびCURRENT_TIMESTAMPデータ型は、VMSまたはSQLのどちらの形式でもかまいません。

VMSを指定した場合、両方のデータ型がVMS形式として解釈されます。VMS形式のDATEおよびCURRENT_TIMESTAMPには、TIMESTAMPのようにYEAR TO SECONDフィールドが含まれます。

SQL99などのSQL規格を指定した場合、両方のデータ型がSQL形式として解釈されます。SQL形式のDATEには、YEAR TO DAYフィールドのみが含まれます。

デフォルトはVMSです。

ANSI_DATE修飾子は将来のリリースで廃止予定のため、DEFAULT DATE FORMAT句を使用してください。

DIALECT

現在の接続に対して次の設定を制御します。

DIALECT句によって、各設定を個々に指定するのではなく1つの句で設定を指定できます。モジュール・プロセッサはモジュール句を順番に処理するため、DIALECT句ではその前に指定された句(QUOTING RULESなど)の設定をオーバーライドすることも、その後に指定される句でオーバーライドされることも可能です。

次の説明はSQL92言語およびSQL99言語固有です。

DIALECT句の各オプションの設定の詳細は、「SET DIALECT文」を参照してください。

DISPLAY CHARACTER SET names-char-set

アプリケーションとSQL間の自動変換に使用されるキャラクタ・セットを指定します。キャラクタ・セットを指定しない場合、デフォルト名はDEC_MCSです。使用可能なキャラクタ・セットのリストは、第2.1.5項を参照してください。

domain-name

直接SQLデータ型を指定したり、ドメインに名前を付けることができます。ドメインに名前を付ける場合、パラメータではドメインのデータ型が継承されます。

FIXED

FIXED句、NULL TERMINATED BYTES句およびNULL TERMINATED CHARACTERS句では、C言語のテキスト・フィールドを解釈する方法がモジュール・プロセッサに通知されます。「使用方法」の例3は、宣言するテキスト・フィールドのサイズが、選択する3つの解釈オプションに応じてどのように異なるかを示しています。

FIXEDを指定すると、モジュール・プロセッサは、ディクショナリのCHARフィールドを固定長文字列と解釈します。

INDICATOR ARRAY OF

exact-numeric-type図に示されるデータ型のいずれかを使用して要素の1次元配列を指定します。インジケータ配列は、ホスト構造体のフィールドに対するインジケータ・パラメータの集まりです。インジケータ配列には、少なくともレコード定義と同じ数の要素が含まれている必要があります。

インジケータ配列をレコードとして使用したり、レコード内に含めることはできません。つまり、INDICATOR ARRAY OF句は第2レベルのレコード指定(レコード型内で指定するレコード型)で使用できません。

インジケータ配列では個別要素を明示的に参照できません。このため、インジケータ配列はUPDATE文またはWHERE句では使用できません。

インジケータ配列の詳細は、第2.2.13.2項を参照してください。

item-name

レコード内の項目の名前を指定します。同じレコード宣言の同じレベルで、2つのレコード項目に同じ名前を指定しないでください。

プロシージャ内のSQL文が、パラメータ宣言と同じプロシージャのサブレコード内にある項目名を参照する場合は、レコード名および介在するすべてのサブレコード名を使用して項目名を完全に修飾する必要があります。レコード名と項目名はピリオドを使用して区切ります。

KEYWORD RULES

識別子をキーワードにできるかどうかを制御します。SQL92、SQL99、SQL89またはMIAを指定した場合、二重引用符で囲む場合を除き、キーワードを識別子として使用できません。SQLV40を指定した場合は、キーワードを識別子として使用できます。デフォルトはSQLV40です。

ANSI_IDENTIFIER修飾子は将来のリリースで廃止予定のため、KEYWORD RULES句を使用してください。

LANGUAGE language-name

プログラムが記述されるホスト言語の名前を指定するキーワードです。このプログラムでは、モジュール内でプロシージャがコールされます。LANGUAGE句に対応するキーワードを持たない言語にGENERALを指定します。

言語識別子により次が決まります。

LITERAL CHARACTER SET support-char-set

キャラクタ・セットまたは各国語キャラクタ・セットによって修飾されないリテラルのキャラクタ・セットを指定します。この句またはNAMES ARE句でキャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。この句は、NAMES ARE句で指定された修飾されていないリテラルのキャラクタ・セットをオーバーライドします。使用可能なキャラクタ・セットのリストは、第2.1節を参照してください。

MODULE module-name

モジュールのオプション名です。モジュール名を指定しない場合、デフォルト名はSQL_MODULEです。

有効なオペレーティング・システム名を使用します。(ユーザー指定の名前の詳細は、第2.2節を参照してください。)ただし、名前は、実行可能イメージを構成するため一緒にリンクされたモジュール間で一意である必要があります。

NAMES ARE names-char-set

モジュールのデフォルト・キャラクタ・セット、識別子キャラクタ・セットおよびリテラル・キャラクタ・セットに使用されるキャラクタ・セットを指定します。この句では、キャラクタ・セットまたは各国語キャラクタ・セットによって修飾されない文字列パラメータも指定します。キャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。

この句で指定したキャラクタ・セットには、ASCIIが含まれている必要があります。使用可能なキャラクタ・セットのリストは、第2.1.5項を参照してください。

NATIONAL CHARACTER SET support-char-set

各国語キャラクタ・セットによって修飾されるリテラルのキャラクタ・セット、および各国語キャラクタ・データ型(NCHAR、NCHAR VARYING)として定義されるパラメータのキャラクタ・セットを指定します。この句でキャラクタ・セットを指定しない場合、デフォルトはDEC_MCSです。使用可能なキャラクタ・セットのリストは、第2.1節を参照してください。

PROCEDURE procedure-name

プロシージャの名前を指定します。有効なOpenVMS名を使用します。(ユーザー指定の名前の詳細は、第2.2節を参照してください。)

プロシージャ名は、特定のプロシージャを指定するためにホスト言語コールで使用されます。SQLモジュールのプロシージャには、プロシージャ名以外に、1つ以上のパラメータ宣言およびSQL文が含まれている必要があります。

QUIET COMMIT ON

QUIET COMMIT OFF

QUIET COMMIT ON句を使用すると、アクティブなトランザクションがないときにCOMMIT文とROLLBACK文のいずれかが実行された場合、これらの文のエラー・レポートが無効になります。QUIET COMMIT OFF句を使用すると、アクティブなトランザクションがないときにCOMMIT文とROLLBACK文のいずれかが実行された場合、これらの文のエラー・レポートが有効になります。


MODULE TXN_CONTROL
LANGUAGE BASIC
PARAMETER COLONS
QUIET COMMIT ON
PROCEDURE S_TXN (SQLCODE);
SET TRANSACTION READ WRITE;

PROCEDURE C_TXN (SQLCODE);
COMMIT;

デフォルトはQUIET COMMIT OFF句です。

QUOTING RULES

二重引用符を文字列リテラルまたはデリミタ付き識別子のどちらで解釈するかを制御します。SQL99、SQL92、SQL89またはMIAを指定した場合は、SQLでは二重引用符をデリミタ付き識別子として解釈します。SQLV40を指定した場合は、SQLでは二重引用符をリテラルとして解釈します。デフォルトはSQLV40です。

ANSI_QUOTING修飾子は将来のリリースで廃止予定のため、QUOTING RULES句を使用してください。

RECORD ... END RECORD

モジュール言語パラメータ宣言で指定するレコードの開始位置と終了位置を指定します。

レコード定義に、SQLDA、SQLDA2、SQLCODE、SQLCAまたはSQLSTATEを含めることはできません。

record-type

record-type句を使用すると、SQLモジュール言語プロシージャにレコードおよびインジケータ配列を渡すことができます。

レコード参照にインジケータがある場合は、インジケータ配列になります。項目名またはパス名のかわりにINDICATOR ARRAY OF句を指定します。

次の例は、SQLモジュール言語プログラムのレコード構造およびインジケータ配列の使用方法を示しています。モジュールのパラメータの先頭にはコロンが付くため、モジュール・ヘッダーにPARAMETER COLONS句を含める必要があります。


MODULE          employee_module
LANGUAGE        pascal
AUTHORIZATION   pers
PARAMETER COLONS

DECLARE pers ALIAS FOR FILENAME mf_personnel

DECLARE WORK_STATUS_CURSOR CURSOR FOR
    SELECT *
    FROM   PERS.WORK_STATUS

PROCEDURE OPEN_WORK_STATUS
    SQLCODE;

    OPEN WORK_STATUS_CURSOR;

PROCEDURE CLOSE_WORK_STATUS
    SQLCODE;

    CLOSE WORK_STATUS_CURSOR;

PROCEDURE FETCH_EMPS_TO_DEPS_CURSOR
    SQLCODE,
    :work_status_rec
        record
        status_code PERS.work_status.STATUS_CODE_DOM
        status_name PERS.work_status.STATUS_NAME_DOM
        status_type PERS.work_status.STATUS_DESC_DOM
        end record
    :ind_array
        record
        indicator array of 3 SMALLINT
        end record
    ;
    FETCH WORK_STATUS_CURSOR
    INTO :work_status_rec INDICATOR :ind_array;

RIGHTS

その認可識別子がモジュールの認可識別子に一致するユーザーが、モジュールを実行するかどうかを指定します。