ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

# DECLARE FUNCTION文

> データベース定義文で使用する外部ファンクション・インタフェースを宣言します。

> DECLARE FUNCTION文の詳細は、「DECLAREルーチン文」を参照してください。プロシージャ宣言の詳細は、「DECLAREルーチン文」を参照してください。

# DECLARE LOCAL TEMPORARY TABLE文

> 明示的にローカル一時表を宣言します。

> 宣言されたローカル一時表のメタデータはデータベースに格納されず、他のモジュールと共有できません。このような表はスクラッチ表とも呼ばれます。

> 表に格納されているデータは、単一のセッションのSQLセッション間や複数のモジュール間では共有できません。永続実表と異なり、メタデータおよびデータはSQLセッションの範囲を超えて永続しません。

> 宣言されたローカル一時表に加えて、他に次の2つの種類の一時表があります。

> - グローバル一時表

> - ローカル一時表

> グローバル一時表およびローカル一時表の詳細は、「CREATE TABLE文」を参照してください。

## 環境

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

> - 対話型SQL内

> - 動的SQLで動的に実行される文として

> - ストアド・モジュール内

## 形式

## 引数

> ### dec-local-col-definition

> 表の列に対する定義です。SQLでは、列定義の指定には次の2通りの方法があります。

> - 列名と関連付けるためのデータ型の直接指定

> - 列名と関連付けるためのデータ型を間接的に指定するドメイン名の指定

> 列定義の詳細は、「CREATE TABLE文」を参照してください。データ型の詳細は、第2.3節を参照してください。

> ### ON COMMIT PRESERVE ROWS

> ### ON COMMIT DELETE ROWS

> 宣言されたローカル一時表で、COMMIT文の後にデータを保存するか、削除するかを指定します。

> 指定しない場合、デフォルトはON COMMIT DELETE ROWSです。

> ### table-name

> 宣言する表の名前です。オプションで表名の前に別名とピリオド（.）を付けることができます。ただし、表名の前にはキーワードMODULEとピリオド（.）を付ける必要があります（MODULE.EMPL_PAYROLLなど）。

## 使用方法

> - 宣言されたローカル一時表名の前にはキーワードMODULEとピリオド（.）を付ける必要があります。例を示します。

>       SQL> DECLARE LOCAL TEMPORARY TABLE MODULE.empl_payroll
>          .
>          .
>          .

> - 宣言されたローカル一時表は、記憶域ではなく仮想メモリーに格納されます。永続実表と同じ記憶域セグメント・レイアウトを使用しますが、管理のオーバーヘッドでさらにメモリー領域を使用します。
>   宣言されたローカル一時表の仮想メモリー必要量の推定の詳細は、『Oracle Rdb7 Guide to Database Design and Definition』を参照してください。

> - メタデータはデータベースに格納されないため、永続実表での使用と同じように多くの場所で宣言されたローカル一時表を使用することはできません。特に、宣言されたローカル一時表では次の処理ができません。

>   - DROP TABLE文を使用した削除

>   - ALTER TABLE文を使用した変更

>   - 切捨て

>   - データ型LIST OF BYTE VARYINGのデータの格納

>   - ビューまたは記憶域マップでの参照

>   - 制約での参照または制約を使用した定義

>   - 索引の格納

>   - トリガーの使用

>   - 権限の付与または取消し

>   - 対話型または動的CREATE OUTLINE文での参照（宣言されたローカル一時表がストアド・モジュールの定義外にある場合）

>   - COMMENT ON文での参照

>   - SET TRANSACTION文のRESERVING句での指定

>   - SHOW文を使用した表示

>   - 別の永続または宣言されたローカル一時表のCOMPUTED BY列での参照

>   - エクスポートまたはインポート（モジュールの一部である場合を除く）

> - 宣言されたローカル一時表の列制約または表制約は定義できません。宣言されたローカル一時表の列は、ドメイン制約を参照できます。

> - 宣言されたローカル一時表でdbkeyを使用できます。

> - Oracle Rdbでは、宣言されたローカル一時表への変更はジャーナリングしませんが、トランザクションの変更のロールバックは管理します。

> - 読取り専用トランザクション中の宣言されたローカル一時表の定義と書込みはできます。

> - 表名は別名で修飾できます。たとえば、データベースの別名がPERSの場合、PAYCHECK_DECL_TABの修飾名はPERS.MODULE.PAYCHECK_DECL_TABです。ただし、宣言されたローカル一時表の名前はカタログまたはスキーマの要素ではありません。

> - 次の表は、一時表を使用して実行できるアクション、および一時表を参照できるタイミングを示します。

>   | 一時表の種類
>   --- | ---
>   アクション | グローバル | ローカル | 宣言されたローカル
>   表の削除 | ○ | ○ | ×
>   表の変更 | ○ | × | ×
>   表の切捨て | ○ | × | ×
>   表または列に対する制約の追加 | ○ | × | ×
>   制約定義の表の参照 | ○2 | ○ | ×
>   ドメイン制約の参照 | ○ | ○ | ○
>   記憶域マップの表の参照 | ○3 | ○ | ×
>   ビューの表の参照 | ○ | ○ | ×
>   一時表に対する権限の付与 | ○ | ○ | ×
>   アウトラインの表の参照 | ○ | ○ | ×1
>   表での索引の作成 | × | × | ×
>   表でのdbkeyの使用 | ○ | ○ | ○
>   表でのトリガーの使用 | ○ | × | ×
>   COMMENT ON文での表の参照 | ○ | ○ | ×
>   LIST OF BYTE VARYINGデータの格納 | × | × | ×
>   RESERVING句での指定 | ○4 | ○4 | ×
>   読取り専用トランザクション中の表への書込み | ○ | ○ | ○
>   読取り専用トランザクションでの作成 | × | × | ○
>   COMPUTED BY列での表の参照 | ○ | ○ | ×

1ストアド・モジュールの内部に定義されている場合は、宣言されたローカル一時表を参照できます。
2一時表からのみ可能です。
3ENABLE COMPRESSION属性またはDISABLE COMPRESSION属性のみ指定可能です。
4そのような参照は無視されます。

グローバル一時表およびローカル一時表の詳細は、「CREATE TABLE文」を参照してください。

- 宣言されたローカル一時表の名前はキーワードMODULEおよびピリオド（.）で修飾されているため、宣言されたローカル一時表は永続実表またはビューと同じ名前を持つことができます。

  ## 例

  > 例1: 対話型SQLでの宣言されたローカル一時表の宣言および使用

  >     SQL> DECLARE LOCAL TEMPORARY TABLE MODULE.PAYCHECK_DECL_INT
  >     cont>        (EMPLOYEE_ID ID_DOM,
  >     cont>         LAST_NAME CHAR(14),
  >     cont>         HOURS_WORKED INTEGER,
  >     cont>         HOURLY_SAL   INTEGER(2),
  >     cont>         WEEKLY_PAY   INTEGER(2))
  >     cont>        ON COMMIT PRESERVE ROWS;
  >     SQL> --
  >     SQL> INSERT INTO MODULE.PAYCHECK_DECL_INT
  >     cont>          (EMPLOYEE_ID, LAST_NAME, HOURS_WORKED, HOURLY_SAL, WEEKLY_PAY)
  >     cont>           SELECT P.EMPLOYEE_ID, E.LAST_NAME, P.HOURS_WORKED,
  >     cont>                  P.HOURLY_SAL, P.HOURS_WORKED * P.HOURLY_SAL
  >     cont>              FROM EMPLOYEES E, PAYROLL P
  >     cont>                  WHERE E.EMPLOYEE_ID = P.EMPLOYEE_ID
  >     cont>                    AND P.WEEK_DATE = DATE '1995-08-01';
  >     100 rows inserted

  >     SQL> SELECT * FROM MODULE.PAYCHECK_DECL_INT LIMIT TO 2 ROWS;
  >      EMPLOYEE_ID   LAST_NAME        HOURS_WORKED       HOURLY_SAL       WEEKLY_PAY
  >      00165         Smith                      40            30.50          1220.00
  >      00166         Dietrich                   40            36.00          1440.00
  >     2 rows selected

  > 例2: 次のものを含むストアド・モジュールの作成

  > - 宣言されたローカル一時表MODULE.PAYCHECK_DECL_TAB

  > - プロシージャPAYCHECK_INS_DECL（宣言されたローカル一時表MODULE.PAYCHECK_DECL_TABに週間給与レコードを挿入）

  > - プロシージャLOW_HOURS_DECL（労働時間が40時間未満の従業員数のカウント）

  > 次の例も、モジュール内からのみ宣言されたローカル一時表にアクセスできることを示しています。

  >     SQL> -- Create the module containing a declared temporary table.
  >     SQL> --
  >     SQL> CREATE MODULE PAYCHECK_DECL_MOD
  >     cont>   LANGUAGE SQL
  >     cont>   DECLARE LOCAL TEMPORARY TABLE MODULE.PAYCHECK_DECL_TAB
  >     cont>          (EMPLOYEE_ID ID_DOM,
  >     cont>           LAST_NAME CHAR(14) ,
  >     cont>           HOURS_WORKED INTEGER, HOURLY_SAL INTEGER(2),
  >     cont>           WEEKLY_PAY   INTEGER(2))
  >     cont>           ON COMMIT PRESERVE ROWS
  >     cont> --
  >     cont> -- Create the procedure to insert rows.
  >     cont> --
  >     cont>   PROCEDURE PAYCHECK_INS_DECL;
  >     cont>   BEGIN
  >     cont>     INSERT INTO MODULE.PAYCHECK_DECL_TAB
  >     cont>          (EMPLOYEE_ID, LAST_NAME, HOURS_WORKED, HOURLY_SAL, WEEKLY_PAY)
  >     cont>           SELECT P.EMPLOYEE_ID, E.LAST_NAME, P.HOURS_WORKED,
  >     cont>                  P.HOURLY_SAL, P.HOURS_WORKED * P.HOURLY_SAL
  >     cont>                  FROM EMPLOYEES E, PAYROLL P
  >     cont>                  WHERE E.EMPLOYEE_ID = P.EMPLOYEE_ID
  >     cont>                    AND P.WEEK_DATE = DATE '1995-08-01';
  >     cont>   END;
  >     cont> --
  >     cont> -- Create the procedure to count the low hours.
  >     cont> --
  >     cont>   PROCEDURE LOW_HOURS_DECL (:cnt INTEGER);
  >     cont>   BEGIN
  >     cont>     SELECT COUNT(*) INTO :cnt FROM MODULE.PAYCHECK_DECL_TAB
  >     cont>            WHERE HOURS_WORKED < 40;
  >     cont>   END;
  >     cont> END MODULE;
  >     SQL> --
  >     SQL> -- Call the procedure to insert the rows.
  >     SQL> --
  >     SQL> CALL PAYCHECK_INS_DECL();
  >     SQL> --
  >     SQL> -- Declare a variable and call the procedure to count records with
  >     SQL> -- low hours.
  >     SQL> --
  >     SQL> DECLARE :low_hr_cnt integer;
  >     SQL> CALL LOW_HOURS_DECL(:low_hr_cnt);
  >       LOW_HR_CNT
  >                2

  >     SQL> --
  >     SQL> -- Because the table is a declared local temporary table, you cannot
  >     SQL> -- access it from outside the stored module that contains it.
  >     SQL> --
  >     SQL> SELECT * FROM MODULE.PAYCHECK_DECL_TAB;
  >     %SQL-F-RELNOTDCL, Table PAYCHECK_DECL_TAB has not been declared in module or
  >     environment

  # DECLARE MODULE文

  > キャラクタ・セット、引用ルール、および非ストアド・モジュールのデフォルトの日付書式などの特性を指定します。

  ## 環境

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

  > - プリコンパイル対象のホスト言語プログラムに埋め込まれる場合

  > - コンテキスト・ファイル内

  > このコマンドは実行可能ではありません。

  ## 形式

  ## 引数

  > ### ALIAS alias-name

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

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

  > アプリケーションが複数のモジュール間で参照する必要があるデータベースが1つのみの場合は、実行可能イメージを構成するためにリンクされるすべてのモジュールで、デフォルト・データベースに同じ別名を使用すると便利です。

  > ### AUTHORIZATION auth-id

  > モジュールの認可識別子を指定します。スキーマ句を指定しない場合、認可識別子によってデフォルト・スキーマが指定されます。

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

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

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

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

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

  > ### CATALOG catalog-name

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

  > ### CHARACTER LENGTH CHARACTERS

  > ### CHARACTER LENGTH OCTETS

  > 文字列パラメータ、列およびドメインの長さを文字またはオクテットのどちらで解釈するかを指定します。デフォルトはオクテットです。

  > ### DEFAULT CHARACTER SET support-char-set

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

  > ### DEFAULT DATE FORMAT SQL99

  > ### DEFAULT DATE FORMAT VMS

  > CURRENT_TIMESTAMP組込みファンクションのデータ型、およびDATEデータ型を指定した列またはCAST式のデフォルトの解釈を制御します。DATEデータ型およびCURRENT_TIMESTAMPデータ型は、VMSまたはANSI/ISO規格形式のどちらでもかまいません。

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

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

  > デフォルトはVMSです。

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

  > ### DIALECT

  > 次の設定を制御します。

  > - 文字列パラメータ、列およびドメインの長さを文字とオクテットのどちらで解釈するか

  > - 二重引用符を文字列リテラルとデリミタ付き識別子のどちらで解釈するか

  > - 識別子をキーワードにできるかどうか

  > - どのビューが読取り専用か

  > - DATEデータ型またはCURRENT_TIMESTAMPデータ型を持つ列をVMSとSQL99のどちらの形式で解釈するか

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

  > 次の説明はSQL99言語固有です。

  > - デフォルトの制約の評価時間の設定が、DEFERRABLEからNOT DEFERRABLEに変更されています。

  > - データの格納時またはデータの取得時に文字のデータ型が変換される場合、特定の状況下では例外または警告が発生します。

  > - SQLモジュール内の仮パラメータにはDECIMALまたはNUMERICを指定できます。また、ホスト言語パラメータをパック10進数または符号付き数値の記憶域形式で宣言できます。指定された精度を超える処理を実行しようとすると、エラー・メッセージが生成されます。

  > - USERキーワードにより、リクエストに対して現在アクティブなユーザー名を指定します。

  > - SETファンクションからNULL値が削除されると、警告が生成されます。

  > - ビューに対してWITH CHECK OPTION句を使用すると、整合性制約障害のために個別エラー・コードが返されます。

  > - C文字列がNULLで終了していない場合、例外が生成されます。

  > 表6-15は、各環境に応じた言語設定を示しています。

  > ### DISPLAY CHARACTER SET names-char-set

  > Oracle RdbからSQLへ返されるテキスト文字列で想定されるキャラクタ・セットのエンコーディングおよび特性を指定します。詳細は、「CREATE DATABASE文」の「使用方法」を参照してください。

  > ### IDENTIFIER CHARACTER SET names-char-set

  > 表名および列名など、データベース・オブジェクト名に使用されるキャラクタ・セットを指定します。この句は、NAMES ARE句で指定されたキャラクタ・セットをオーバーライドします。使用可能なキャラクタ・セットおよびオプション値のリストは、第2.1.5項を参照してください。

  > 指定したキャラクタ・セットには、ASCII文字が含まれている必要があります。

  > ### KEYWORD RULES

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

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

  > ### LITERAL CHARACTER SET support-char-set

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

  > ### MODULE module-name

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

  > 有効なOpenVMS名を使用します。（ユーザー指定の名前の詳細は、第2.2節を参照してください。）ただし、名前は、実行可能イメージを構成するため一緒にリンクされたモジュール間で一意である必要があります。

  > ### NAMES ARE names-char-set

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

  > この句で指定されたキャラクタ・セットが、特定の接続によってアタッチされたすべてのデータベースのキャラクタ・セットと一致し、ASCII文字を含んでいることを確認する必要があります。使用可能なキャラクタ・セットのリストは、第2.1.5項を参照してください。

  > ### NATIONAL CHARACTER SET support-char-set

  > 各国語キャラクタ・セットによって修飾されるリテラルのキャラクタ・セットを指定します。使用可能なキャラクタ・セットのリストは、第2.1節を参照してください。

  > ### PARAMETER COLONS

  > PARAMETER COLONS句を使用する場合、すべてのパラメータ名をコロン（:）で始める必要があります。これはモジュール言語のコンテキスト・ファイルのみで有効です。このルールは、モジュール言語プロシージャ・パラメータの宣言と参照の両方に適用されます。この句を使用しない場合は、パラメータ名をコロンで始めることはできません。

  > 現在のデフォルトの動作では、コロンは使用されません。ただし、このデフォルトは廃止予定の構文です。コロンを使用するとANSI/ISO SQL規格モジュールの処理を実行できるようになるため、将来的にはコロンの必須の使用がデフォルトになる予定です。

  > SQLOPTIONS = ANSI_PARAMETERS修飾子は将来のリリースで廃止予定のため、PARAMETER COLONS句を使用してください。

  > ### QUOTING RULES

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

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

  > ### RIGHTS INVOKER

  > ### RIGHTS RESTRICT

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

  > RESTRICTを指定した場合、SQLではデフォルトの認可識別子に基づいて権限チェックが行われます。モジュールでAUTHORIZATION句を使用して異なる認可識別子を指定しないかぎり、モジュールをコンパイルするユーザーの認可識別子がデフォルトの認可識別子です。RESTRICTオプション句を使用すると、モジュールを実行するユーザーのユーザー名が、デフォルトの認可識別子と比較され、正しい認可識別子を持つユーザー以外のすべてのユーザーがそのモジュールを起動できなくなります。マルチスキーマを使用するアプリケーションはすべて、デフォルトで実行者を制限します。

  > INVOKERを指定した場合、権限はモジュール実行ユーザーの認可識別子に基づきます。デフォルトはINVOKERです。

  > SQLOPTIONS = ANSI_AUTHORIZATION修飾子は将来のリリースで廃止予定のため、RIGHTS句を使用してください。

  > ### SCHEMA schema-name

  > モジュールのデフォルト・スキーマ名を指定します。デフォルト・スキーマとは、SQL文によって表および他のスキーマ名が認可識別子で修飾されない場合に、そのSQL文から参照されるスキーマのことです。モジュールにデフォルト・スキーマ名を指定しない場合、デフォルトの認可識別子を指定する必要があります。

  > SCHEMA句を使用すると、個々のモジュールがそれぞれ異なるスキーマをデフォルト・スキーマとして宣言できます。これは、複数のスキーマを参照する必要のあるアプリケーションで便利な場合があります。適切なモジュールのプロシージャでスキーマを参照するSQL文を配置すると、それらの文のスキーマ要素名の冗長な修飾を最小限に抑えることができます。

  > SCHEMA schema-name AUTHORIZATION auth-idを指定する場合は、モジュールのスキーマ名およびスキーマ認可識別子を指定します。スキーマ認可識別子は、スキーマの所有者および作成者であるとみなされ、すべての権限が含まれます。

  > ### VIEW UPDATE RULES

  > コンパイル時に作成されるすべてのビューに、SQLモジュール・プロセッサが更新可能ビューに関するANSI/ISO SQL規格を適用するかどうかを指定します。