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

戻る
戻る
 
次へ
次へ
 

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 PROCEDURE文の詳細は、「DECLAREルーチン文」を参照してください。プロシージャ宣言の詳細は、「DECLAREルーチン文」を参照してください。


DECLAREルーチン文

データベース定義文で使用するルーチン・インタフェースを宣言します。ルーチンはファンクションかプロシージャのいずれかです。

宣言されたルーチンは、CREATE TABLE文、CREATE VIEW文およびCREATE MODULE文などのDDL文のファンクションまたはプロシージャに対するコールのテンプレートとして動作します。テンプレートによってRdbは、ルーチンに正しく名前が付けられており、正しい数のパラメータが渡されており、さらにそのパラメータに互換性のある引数が渡されていることが検証できます。ファンクションでは、返されたデータ型を使用して、COMPUTED BY、AUTOMATICおよびその他の格納された値式のデータ型を計算します。


環境

DECLAREルーチン文は次の環境で使用できます。


形式






引数

DEFAULT value-expr

INモードで定義したファンクションまたはプロシージャに対するパラメータのデフォルト値を指定します。このパラメータを省略するか、CALL文の引数リストまたはファンクションの起動でDEFAULTキーワードが指定される場合は、この句に指定したvalue-exprが使用されます。値式を明示的に指定しない場合は、パラメータでNULLがデフォルトとして使用されます。

FUNCTION

ファンクション定義を宣言します。

このファンクションはINパラメータのリストをオプションで受け入れ、常に値を返し、値式の要素として名前で参照されます。

LANGUAGE SQL

ルーチンをコールする言語を指定します。

mechanism-clause

外部ルーチンの受渡しメカニズムを定義します。次のリストでは、受渡しメカニズムについて説明します。

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項を参照してください。

使用方法


例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;


DECLARE STATEMENT文

動的SQLのPREPARE文で後から使用する文名を記録します。SQLでは、DECLARE STATEMENT文は不要で、そのプリコンパイル時にコードは生成されません。これらは完全にオプションです。

環境

DECLARE STATEMENT文はプリコンパイルするホスト言語プログラムでのみ発行できます。

形式



引数

statement-name STATEMENT

次のいずれかの埋込み動的文で後から参照する文の名前を指定します。


例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文

プログラムで明示的に表定義またはビュー定義を宣言します。DECLARE TABLE文で名前を付けた表では、明示的な宣言と定義を比較するためのスキーマのチェックは実行されません。

明示的な表宣言は次のような場合に便利です。


環境

DECLARE TABLE文は次の環境で使用できます。


形式
















引数

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


DECLARE TRANSACTION文

デフォルトのトランザクションの特性を指定します。トランザクションとは、その変更を永続化できる、または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文を使用するタイミングの例は、「使用方法」を参照してください。

DECLARE TRANSACTION文で、次のような多数のオプションを指定できます。


環境

DECLARE TRANSACTION文は次の環境で使用できます。

ホスト言語プログラムでは、個別にコンパイルされた各ソース・ファイルで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文」を参照してください。