SQL99、SQL92、SQL89またはMIAを指定した場合、SQLモジュール・プロセッサにより、その更新可能ビューのANSI/ISO SQL規格がコンパイル時に作成されるすべてのビューに適用されます。指定された更新可能ビューに関するANSI/ISO SQL規格に準拠しないビューは、更新できません。
指定された更新可能ビューに関するANSI/ISO SQL規格では、SELECT文で次の条件が満たされる必要があります。
SQLV40を指定した場合、SQLではANSI/ISO規格は更新可能ビューに適用されません。かわりに、次の条件を満たすビューは更新可能とみなされます。
例1: 異なるキャラクタ・セットの文字列を指定するモジュールの宣言データベースのキャラクタ・セットがプログラムに指定されたキャラクタ・セットに一致すると仮定すると、次の例は、COLOURS表から1つの行を取得する単純なSQLのプリコンパイルされたCプログラムを示します。
/* This SQL precompiled program does some simple tests of character length * and character sets. */ #include stdio #include descrip main() { /* Specify CHARACTER LENGTH CHARACTERS in the DECLARE MODULE statement. * In addition, specify the NAMES, NATIONAL, and DEFAULT character sets. */ EXEC SQL DECLARE MODULE CCC_COLOURS NAMES ARE DEC_KANJI NATIONAL CHARACTER SET KANJI SCHEMA RDB$SCHEMA AUTHORIZATION SQL_SAMPLE CHARACTER LENGTH CHARACTERS DEFAULT CHARACTER SET DEC_KANJI ALIAS RDB$DBHANDLE; /* If you do not specify character sets in the DECLARE ALIAS statement, SQL * uses the character sets of the compile-time database. */ EXEC SQL DECLARE ALIAS FILENAME MIA_CHAR_SET; int SQLCODE; /* Because the default character set is DEC_KANJI, you do not need to qualify * the variable dec_kanji_p with the character set, but you must declare * char in lowercase. */ char dec_kanji_p[31]; /* When you declare a parameter with lowercase char, SQL considers the * character set unspecified and allocates single-octet characters. */ char english_p[31]; /* When you specify the character set, SQL allocates single- or multi-octet * characters, depending upon the character set. */ char CHARACTER SET DEC_MCS french_p[31]; char CHARACTER SET KANJI japanese_p[31]; . . . /* Select one row from the COLOURS table. */ EXEC SQL SELECT ENGLISH, FRENCH, JAPANESE, ROMAJI, KATAKANA, HINDI, GREEK, ARABIC, RUSSIAN INTO :english_p, :french_p, :japanese_p, :dec_kanji_p, :katakana_p, :devanagari_p, :isolatingreek_p, :isolatinarabic_p, :isolatincyrillic_p FROM COLOURS LIMIT TO 1 ROW; if (SQLCODE != 0) SQL$SIGNAL(); printf ("\nENGLISH: %s", english_p); printf ("\nFRENCH: %s", french_p); printf ("\nJAPANESE: %s", japanese_p); printf ("\nROMAJI: %s", dec_kanji_p); printf ("\nKATAKANA: %s", katakana_p); printf ("\nHINDI: %s", devanagari_p); printf ("\nGREEK: %s", isolatingreek_p); printf ("\nARABIC: %s", isolatinarabic_p); printf ("\nRUSSIAN: %s", isolatincyrillic_p); EXEC SQL ROLLBACK; }
データベース定義文で使用するプロシージャ・インタフェースを宣言します。DECLARE PROCEDURE文の詳細は、「DECLAREルーチン文」を参照してください。プロシージャ宣言の詳細は、「DECLAREルーチン文」を参照してください。
データベース定義文で使用するルーチン・インタフェースを宣言します。ルーチンはファンクションかプロシージャのいずれかです。宣言されたルーチンは、CREATE TABLE文、CREATE VIEW文およびCREATE MODULE文などのDDL文のファンクションまたはプロシージャに対するコールのテンプレートとして動作します。テンプレートによってRdbは、ルーチンに正しく名前が付けられており、正しい数のパラメータが渡されており、さらにそのパラメータに互換性のある引数が渡されていることが検証できます。ファンクションでは、返されたデータ型を使用して、COMPUTED BY、AUTOMATICおよびその他の格納された値式のデータ型を計算します。
DECLAREルーチン文は次の環境で使用できます。
- 対話型SQL内
- 動的SQLで動的に実行される文として
DEFAULT value-expr
INモードで定義したファンクションまたはプロシージャに対するパラメータのデフォルト値を指定します。このパラメータを省略するか、CALL文の引数リストまたはファンクションの起動でDEFAULTキーワードが指定される場合は、この句に指定したvalue-exprが使用されます。値式を明示的に指定しない場合は、パラメータでNULLがデフォルトとして使用されます。FUNCTION
ファンクション定義を宣言します。このファンクションはINパラメータのリストをオプションで受け入れ、常に値を返し、値式の要素として名前で参照されます。
LANGUAGE SQL
ルーチンをコールする言語を指定します。mechanism-clause
外部ルーチンの受渡しメカニズムを定義します。次のリストでは、受渡しメカニズムについて説明します。
- BY DESCRIPTOR
『OpenVMS Calling Standard』を実装した言語コンパイラでコンパイルしたルーチンに対して、文字データをパラメータ・アクセス・モードで渡すことができます。- BY LENGTH
LENGTH受渡しメカニズムは、DESCRIPTOR受渡しメカニズムと同一のものです。- BY REFERENCE
実際のデータへの参照として、パラメータ・アクセス・モードでデータを渡すことができます。
これはパラメータのデフォルトの受渡しメカニズムです。また、文字データを返すファンクション値のデフォルトの受渡しメカニズムでもあります。- BY VALUE
データを値として、INパラメータ・アクセス・モードでルーチンに渡し、ファンクションで値を返すことができます。
これは文字以外のデータを返すファンクション値のデフォルトの受渡しメカニズムです。
parameter-list
ルーチンのオプションのパラメータです。それぞれのパラメータについて、パラメータ・アクセス・モード(IN、OUTおよびINOUT)、パラメータ名、データ型、受渡しメカニズム(DESCRIPTOR、LENGTH、REFERENCEまたはVALUEによる)を指定できます。パラメータ・アクセス・モード(IN、OUTおよびINOUT)はオプションであり、パラメータへのアクセス方法(読取り、書込み、またはその両方)を指定します。INは読取り専用、OUTは書込み専用、INOUTは読取りおよび書込みを表します。パラメータ・アクセス・モードはINにデフォルト設定されます。
INパラメータ・アクセス・モードのみ、ファンクションに対してパラメータで指定できます。いずれかのパラメータ・アクセス・モード(IN、OUTおよびINOUT)を、プロシージャに対してパラメータで指定できます。
パラメータ名には、接頭辞としてコロン(:)が付きます。パラメータ名はルーチン・パラメータ内で一意である必要があります。
データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。
パラメータは、LIST OF BYTE VARYINGデータ型としては宣言できません。
PROCEDURE
プロシージャ定義を宣言します。このプロシージャはIN、OUTまたはINOUTパラメータのリストをオプションで受け入れ、CALL文において名前で参照されます。
RETURNS result-data-type
RETURNS domain-name
ファンクション(戻り)値について説明します。データ型と受渡しメカニズム(BY DESCRIPTOR、LENGTH、REFERENCEまたはVALUE)を指定できます。定義では、ファンクション値はOUTアクセス・モード値です。データ型が必要であり、これはSQLデータ型またはドメイン名を使用するパラメータのタイプを示します。
ファンクション値は、LIST OF BYTE VARYINGデータ型としては宣言できません。
routine-name
外部ルーチン名です。この名前は外部ルーチンおよびスキーマのストアド・ルーチンで一意にする必要があり、別名で、または(マルチスキーマ・データベースの場合は)スキーマ名で修飾できます。STORED NAME IS identifier
マルチスキーマ・データベースに定義する際、ルーチンへのアクセスに使用される名前です。ストアド名を使用すると、1つのデータベース内では複数のスキーマを認識しないインタフェースを使用して、マルチスキーマ定義にアクセスできます。複数のスキーマに対応しないデータベース内では、ルーチンのストアド名は指定できません。ストアド名の詳細は、第2.2.18項を参照してください。
- 同じルーチン名で追加のDECLARE文が実行される場合は、既存の定義と同じである必要があります。
- CREATE FUNCTION文、CREATE PROCEDURE文またはCREATE MODULE文を使用して作成されるルーチンは、パラメータ数、データ型(ドメインは基本データ型に置換可能、基本データ型はドメインに置換可能)、受渡しメカニズム(BY VALUE、BY REFERENCE、BY LENGTH、BY DESCRIPTOR)およびモード(IN、OUTおよびINOUT)が正確に一致する必要があります。
- パラメータにDEFAULT句を指定して、ルーチンの最小および最大のパラメータ数を計算できるようにする必要があります。ただし、このDEFAULT値は使用されず、NULL、つまりプレースホルダとして指定される場合があります。
- 宣言されたルーチンは、CREATE FUNCTION文、CREATE PROCEDURE文またはCREATE MODULE文に置換されるまで、セッションの一部分として残ります。
CREATE FUNCTION文、CREATE PROCEDURE文またはCREATE MODULE文がロールバックされた場合、置換される宣言ルーチンも削除されます。したがって、そのような場合は新しいDECLAREが必要になります。- CREATE文で実際のルーチン本体(ストアドまたは外部)が定義される前にセッションが切断された場合、そのようなルーチンを参照するデータベース・オブジェクトを使用しようとすると失敗します。
これはDROP ... CASCADEの使用後に確認される動作と類似しています。つまり、これらのオブジェクトを作成することによって修正する必要がある未解決の参照があります。- SQL EXPORT、IMPORTおよびRMU Extractなどのツールは、DECLAREルーチン機能を使用して、生成されるデータベース定義操作での前方参照を可能にします。
RMU Extractの場合は、/ITEM=FORWARD_REFERENCE修飾子を使用してDECLARE文の出力を有効にする必要があります。SQL EXPORTの場合、これがデフォルト設定であり、EXPORTコマンドまたはIMPORTコマンドでNO FORWARD_REFERENCES句を使用して無効にできます。
例1: ドメインの定義および外部ファンクションの参照
SQL> create domain MONEY as integer (2); SQL> SQL> create function INTEREST_PAID cont> (in :amt MONEY) cont> returns MONEY; cont> external cont> language C cont> parameter style GENERAL; SQL> SQL> alter domain MONEY cont> add cont> check (INTEREST_PAID (value) > 0) cont> not deferrable;
ALTER DOMAINが完了すると、もう片方の前にファンクションもドメインも定義できません。次は、RMU Extractコマンドからの出力の実行結果の一部を示しています。
SQL> create domain MONEY cont> INTEGER (2) cont> check((INTEREST_PAID(value) > 0)) cont> not deferrable; %SQL-F-RTNNOTDEF, function or procedure INTEREST_PAID is not defined SQL> SQL> commit work; SQL> create function INTEREST_PAID ( cont> in :AMT cont> MONEY cont> by reference) cont> returns cont> MONEY by value cont> language SQL; cont> external cont> language C cont> parameter style GENERAL cont> deterministic cont> called on null input cont> ; %SQL-F-NO_SUCH_FIELD, Domain MONEY does not exist in this database or schema SQL> commit work;
RMU Extractでは、次のようにFORWARD_REFERENCES項目をコマンドラインに追加することによってこの問題を回避しています。
$ RMU/EXTRACT/ITEM=(ALL,FORWARD_REFERENCES) databasename/OUTPUT=script.SQL
スクリプトにはこれでファンクションINTEREST_PAIDの前方宣言が含まれるため、スクリプトの実行は成功します。
SQL> declare function INTEREST_PAID ( cont> in :AMT cont> INTEGER (2)) cont> returns cont> INTEGER (2) cont> ; SQL> SQL> create domain MONEY cont> INTEGER (2) cont> check((INTEREST_PAID(value) > 0)) cont> not deferrable; SQL> SQL> commit work; SQL> create function INTEREST_PAID ( cont> in :AMT cont> MONEY cont> by reference) cont> returns cont> MONEY by value cont> language SQL; cont> external cont> language C cont> parameter style GENERAL cont> deterministic cont> called on null input cont> ; SQL> commit work;
動的SQLのPREPARE文で後から使用する文名を記録します。SQLでは、DECLARE STATEMENT文は不要で、そのプリコンパイル時にコードは生成されません。これらは完全にオプションです。
DECLARE STATEMENT文はプリコンパイルするホスト言語プログラムでのみ発行できます。
statement-name STATEMENT
次のいずれかの埋込み動的文で後から参照する文の名前を指定します。
- PREPARE
- DECLARE CURSOR
- DESCRIBE
例1: PL/Iプログラムでの文名の宣言
この例は、文名DYNAMIC_STATEMENTを宣言するプログラム行を示しています。この例の後の行ではDECLARE CURSOR文、PREPARE文およびDESCRIBE文がDYNAMIC_STATEMENT文を参照する方法を示しています。明示的に文を宣言する必要がないため、DECLARE STATEMENT文は常にオプションです。
EXEC SQL DECLARE DYNAMIC_STATEMENT STATEMENT; /* Declare the SQL Communications Area. */ EXEC SQL INCLUDE SQLCA; /* Declare the SQL Descriptor Area. */ EXEC SQL INCLUDE SQLDA; /* The program declares the host language variable STATEMENT_STRING and stores in it the character string containing a SELECT statement to be executed dynamically. */ . . . EXEC SQL DECLARE CURSOR1 CURSOR FOR DYNAMIC_STATEMENT; EXEC SQL PREPARE OBJECT_STATEMENT FROM STATEMENT_STRING; EXEC SQL DESCRIBE OBJECT_STATEMENT INTO SQLDA; /* The program sets up pointers in the SQLDATA field of the SQLDA to the data area (host language variables or dynamic memory, for example) to receive the data from the cursor. */ . . . EXEC SQL OPEN CURSOR1; DO WHILE (SQLCODE = 0); EXEC SQL FETCH CURSOR1 USING DESCRIPTOR SQLDA; /* The program prints or otherwise processes rows of the result tables. */ . . . END; EXEC SQL CLOSE CURSOR1;
プログラムで明示的に表定義またはビュー定義を宣言します。DECLARE TABLE文で名前を付けた表では、明示的な宣言と定義を比較するためのスキーマのチェックは実行されません。明示的な表宣言は次のような場合に便利です。
- プログラムのソース・コードの定義を記録する場合
- SQLのプログラムのプリコンパイル時に存在しない、次のような表を参照可能にする場合
- プログラムの他のモジュールで作成された表
- 動的に作成された表
- プリコンパイラのパフォーマンスを向上させる場合(SQLではスキーマにアタッチして表定義を取得する必要がないため)
- プログラムが表からの値の保持または表への値の保持に使用するホスト構造体に宣言が正しく対応しているかどうかのチェックを簡易化する場合
- プログラムが一部の列しか使用する必要がない場合に、表のスキーマ定義に含まれている列のサブセットのみを宣言する場合
DECLARE TABLE文は次の環境で使用できます。
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- コンテキスト・ファイル内
- SQLモジュールのDECLAREセクションの一部として
character-set-name
有効なキャラクタ・セット名です。キャラクタ・セットの詳細は、第2.1節を参照してください。col-constraint
列制約です。列制約の詳細は、「CREATE TABLE文」を参照してください。column-name
定義する列の名前です。data-type
定義する列のデータ型です。データ型の詳細は、第2.3節を参照してください。date-time-data-types
日付、時間および間隔のデータ型です。日時データ型の詳細は、第2.3.2項を参照してください。declare-col-definition
表の列に対する定義です。列定義は、スキーマの表定義に対応する必要があります。列定義の詳細は、「CREATE TABLE文」を参照してください。
ただし、DECLARE TABLE文ではドメイン名を参照できません。定義がドメイン名を参照する表の場合、ドメインのデータ型とサイズをドメイン名のかわりに使用する必要があります。
frac
interval-qualifier
prec
seconds-prec
日時データ型の精度を指定します。詳細は、第2.3.2項を参照してください。references-clause
詳細は、「CREATE TABLE文」を参照してください。sql-and-dtr-clause
オプションのSQLおよびDATATRIEVEフォーマット句です。フォーマット句の詳細は、第2.5節を参照してください。table-name
view-name
宣言する表定義またはビュー定義の名前です。table-constraint
表全体に適用される制約を定義します。表制約の指定方法の詳細は、「CREATE TABLE文」を参照してください。
SQLでは、埋込みSQL文のプリコンパイル、または表を参照するモジュール・プロシージャの処理の際に、DECLARE TABLE文の宣言を使用します。したがって、宣言の列はスキーマ定義の列と一致する必要があります。ただし、DECLARE TABLE文の宣言が対応している表定義またはビュー定義は、プログラムがDECLARE TABLE文を発行するまでは存在している必要がありません。プログラムが表を作成できるのは宣言された後です。
例1: COBOLプログラムでの表EMPLOYEESの宣言
EXEC SQL DECLARE EMPLOYEES TABLE (EMPLOYEE_ID CHAR (5) CONSTRAINT EMP_EMPLOYEE_ID_NOT_NULL NOT NULL, LAST_NAME CHAR (14), FIRST_NAME CHAR (10), MIDDLE_INITIAL CHAR (1), ADDRESS_DATA_1 CHAR (25), ADDRESS_DATA_2 CHAR (25), CITY CHAR (20), STATE CHAR (2), POSTAL_CODE CHAR (5), SEX CHAR (1), CONSTRAINT EMP_SEX_VALUES CHECK ( SEX IN ('M', 'F') OR SEX IS NULL ), BIRTHDAY DATE , STATUS_CODE CHAR (1) CONSTRAINT EMP_STATUS_CODE_VALUES CHECK ( STATUS_CODE IN ('0', '1', '2') OR STATUS_CODE IS NULL ) ) END_EXEC
デフォルトのトランザクションの特性を指定します。トランザクションとは、その変更を永続化できる、または1つの単位としてのみ元に戻せる文の集合です。トランザクションは、COMMIT文またはROLLBACK文で終了します。COMMIT文でトランザクションを終了する場合、文によるデータベースへのすべての変更は永続化されます。ROLLBACK文でトランザクションを終了する場合、文は有効になりません。
DECLARE TRANSACTION文で指定された特性は、別のDECLARE TRANSACTION文を発行するまで、(SET TRANSACTION文またはSTART TRANSACTION文によって開始されたものを除き)すべてのトランザクションに影響します。SET TRANSACTION文またはSTART TRANSACTION文に指定された特性は、そのトランザクションにのみ影響します。
DECLARE TRANSACTION文ではトランザクションは開始されません。DECLARE TRANSACTION文で行われた宣言は、SQLで新規トランザクションが開始されるまで有効になりません。SQLでは、DECLARE TRANSACTION文、COMMIT文またはROLLBACK文に続く最初の実行可能データ操作文またはデータ定義文で新規トランザクションが開始されます。(COMMIT文またはROLLBACK文に続く)データ定義文の場合、直前に終了したトランザクションに対して宣言したトランザクション特性は次に開始するトランザクションに適用されます。
DECLARE TRANSACTION文に加えて、次の2つの方法のいずれかでトランザクション特性を指定できます。
- SET TRANSACTION文またはSTART TRANSACTION文を指定した場合、文の宣言は即時に有効になり、新規トランザクションが開始されます。
- 明示的にトランザクションを宣言または設定せずに、データを取得および更新できます。DECLARE TRANSACTION文、SET TRANSACTION文またはSTART TRANSACTION文を省略した場合、COMMIT文またはROLLBACK文に続く最初の実行可能データ操作文またはデータ定義文で(読取り/書込みオプションを使用して)自動的にトランザクションが開始されます。
SET TRANSACTION文またはSTART TRANSACTION文のかわりにDECLARE TRANSACTION文を使用するタイミングの例は、「使用方法」を参照してください。
DECLARE TRANSACTION文で、次のような多数のオプションを指定できます。
- トランザクション・モード(READ ONLY/READ WRITE/BATCH UPDATE)
- ロック指定句(RESERVINGオプション)
- 待機モード(WAIT/NOWAIT)
- 分離レベル
- 制約評価の指定句
- トランザクションに関与する各データベースのすべての先行オプションの複数セット(ON句)
DECLARE TRANSACTION文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- コンテキスト・ファイル内
- SQLモジュールのDECLAREセクションの一部として
- CREATE MODULE文のモジュール・ヘッダーの一部として
- 動的SQLで動的に実行される文として
ホスト言語プログラムでは、個別にコンパイルされた各ソース・ファイルで1つのDECLARE TRANSACTION文のみを設定できます。詳細は、「使用方法」を参照してください。
DECLARE TRANSACTION文は、標準SQL構文の拡張機能です。プログラムが標準SQL構文に準拠する必要がある場合は、コンテキスト・ファイルに配置することによってDECLARE TRANSACTION文を分離できます。コンテキスト・ファイルの詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。
DECLARE TRANSACTION文の引数はSET TRANSACTION文の引数と同じです。両方の文の引数の詳細は、「SET TRANSACTION文」を参照してください。
DECLARE TRANSACTION文のデフォルトはSET TRANSACTION文のデフォルトと同じです。詳細は、「SET TRANSACTION文」を参照してください。通常は、デフォルトのトランザクション特性に依存しないでください。読取り/書込み、読取り専用またはバッチ更新のオプション、RESERVING句の表のリスト、各表の共有モードおよびロック・タイプを指定して、明示的なDECLARE TRANSACTION文を使用します。DECLARE TRANSACTION文が具体的になるほど、データベース操作が効率的になります。
DECLARE TRANSACTION文で指定された特性を使用してトランザクションが開始されると、DECLARE TRANSACTION文で指定されていないトランザクション特性は、SQLのデフォルトを取ります。これは、DECLARE TRANSACTIONで指定されていない特性が、前のSET TRANSACTION文またはDECLARE TRANSACTION文で指定されていた場合にも該当します。
次の点はDECLARE TRANSACTIONに固有です。DECLARE TRANSACTION文とSET TRANSACTION文に共通の使用方法は、「SET TRANSACTION文」を参照してください。
- DECLARE TRANSACTION文は非実行可能文であるため、トランザクションは開始されません。(DECLARE TRANSACTION文での宣言が有効になるのは、新規トランザクションの開始時、つまり、DECLARE TRANSACTION文、COMMIT文またはROLLBACK文に続く最初の実行可能なデータ操作文またはデータ定義文の実行時です。)
ホスト言語ソース・ファイルまたはSQLモジュールには、1つのDECLARE TRANSACTION文のみを適用できます。SET TRANSACTION文を使用して、DECLARE TRANSACTION文を使用して最初に指定されたプログラムのトランザクション特性を変更します。
DECLARE TRANSACTION文には、次の利点があります。
- 対話型SQLセッション、プログラム内のモジュールまたは単一ホスト言語ファイル、またはモジュールから動的に実行される任意の文についてトランザクションのデフォルトを確立できます。たとえば、対話型SQL環境を設定するために作成するSQLINI.SQLファイルには、DECLARE TRANSACTION READ ONLYを指定できます。
対話型SQLでは、DECLARE TRANSACTION文によって指定される特性は、別のDECLARE TRANSACTION文を入力するまで有効です。(SET TRANSACTION文が後ろに続くCOMMIT文またはROLLBACK文により、別の特性を使用してトランザクションが開始される場合がありますが、暗黙的に開始される後続のトランザクションには、最後のDECLARE TRANSACTION文に指定されている特性が使用されます。)
ただし、SET TRANSACTION文を使用して特性を指定する場合、これらの特性はこのトランザクションにのみ適用されます。これらの特性を再確立するには、この文をすべてのCOMMIT文またはROLLBACK文の後で再入力する必要があります。
次の順序は、DECLARE TRANSACTION文の後ろに続くSET TRANSACTION文を示しています。SET TRANSACTION文の後ろにはROLLBACK文が続いています。