ヘッダーをスキップ

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

戻る | 次へ |

例9: レコードの水平パーティション化と垂直パーティション化の両方を定義する記憶域マップの表示

    SQL> SHOW STORAGE MAP  EMPLOYEES_1_MAP2
         EMPLOYEES_1_MAP2
     For Table:             EMP2
     Partitioning is:       UPDATABLE
     Store clause:          STORE COLUMNS (EMPLOYEE_ID, LAST_NAME, FIRST_NAME,
                            MIDDLE_INITIAL, STATUS_CODE)
                USING (EMPLOYEE_ID)
                   IN ACTIVE_AREA_A WITH LIMIT OF ('00399')
                   IN ACTIVE_AREA_B WITH LIMIT OF ('00699')
                   OTHERWISE IN ACTIVE_AREA_C
             STORE COLUMNS (ADDRESS_DATA_1, ADDRESS_DATA_2, CITY,
                            STATE, POSTAL_CODE)
                USING (EMPLOYEE_ID)
                   IN INACTIVE_AREA_A WITH LIMIT OF ('00399')
                   IN INACTIVE_AREA_B WITH LIMIT OF ('00699')
                   OTHERWISE IN INACTIVE_AREA_C
             STORE IN OTHER_AREA
     Compression is:        ENABLED
     Partition 2:           Compression is Enabled
     Partition 3:           Compression is Enabled

例10: 順序の表示

    SQL> SHOW SEQUENCE EMPIDS
         EMPIDS
     Sequence Id: 3
     Initial Value: 1
     Minimum Value: 1
     Maximum Value: 9223372036854775787
     Next Sequence Value: 1
     Increment by: 1
     Cache Size: 20
     Order
     No Cycle
     No Randomize
     Comment:       Sequence for employee IDs.

例11: ロールの表示

    SQL> SHOW ROLE SECRETARY
         SECRETARY
     Identified Externally
     Comment:       Role for the secretarial staff

例12: ユーザーの表示

    SQL> SHOW USER NSTEWART
         NSTEWART
     Identified Externally
     Account Unlocked
     Comment:       Nicholas Stewart

例13: 1つのプロファイルの詳細の表示

    SQL> SHOW PROFILE
    Profiles in database with filename SQL$DATABASE
         DECISION_SUPPORT
    SQL> SHOW PROFILE DECISION_SUPPORT
         DECISION_SUPPORT
     Comment:       limit transactions used by report writers
         Transaction modes (read only, no read write)
    SQL> ALTER PROFILE DECISION_SUPPORT
    cont>   default transaction read only;
    SQL> SHOW PROFILE DECISION_SUPPORT
         DECISION_SUPPORT
     Comment:       limit transactions used by report writers
         Default transaction read only
         Transaction modes (read only, no read write)
    SQL>

例14: 大/小文字が混在する名前のデリミタ付き識別子の使用の表示

    SQL> CREATE PROFILE "Decision_Support"
    cont> COMMENT IS 'limit transactions used by report writers'
    cont> TRANSACTION MODES (NO READ WRITE, READ ONLY);
    SQL> SHOW PROFILE
    Profiles in database with filename SQL$DATABASE
         Decision_Support
    SQL> SHOW PROFILE Decision_Support
     No Users found
    SQL> SHOW PROFILE "Decision_Support"
         Decision_Support
     Comment:       limit transactions used by report writers
         Transaction modes (read only, no read write)

例15: シノニムの表示

    SQL> SHOW SYNONYMS
    Synonyms in database with filename SQL$DATABASE
         C_SAL                           View                 CURRENT_SALARY
         E                               Table synonym        EMPS
         EMPS                            Table                EMPLOYEES
         ID_NUMBER                       Domain               ID_DOM

    SQL> SHOW SYNONYMS ID_NUMBER
     ID_NUMBER
     for domain  ID_DOM
     Comment:       support the old name for this domain

    SQL> SHOW VIEWS

    User tables in database with filename SQL$DATABASE
         CURRENT_INFO                    A view.
         CURRENT_JOB                     A view.
         CURRENT_SALARY                  A view.
         C_SAL                           A synonym for view CURRENT_SALARY

例16: シノニムを使用したオブジェクトの識別

この例では、順序および順序のシノニムを作成し、このシノニムでSHOW SEQUENCEコマンドを使用しています。

    SQL> create sequence department_id_sequence;
    SQL> create synonym dept_id_s for department_id_sequence;
    SQL> show sequence
    Sequences in database with filename personnel
         DEPARTMENT_ID_SEQUENCE
         DEPT_ID_S                       A synonym for sequence DEPARTMENT_ID_SEQUENCE
    SQL> show sequence DEPT_ID_S
         DEPT_ID_S                       A synonym for sequence DEPARTMENT_ID_SEQUENCE
     Sequence Id: 1
     Initial Value: 1
     Minimum Value: 1
     Maximum Value: 9223372036854775787
     Next Sequence Value: 1
     Increment by: 1
    Next Sequence Value: 1
     Increment by: 1
     Cache Size: 20
     No Order
     No Cycle
     No Randomize
     Wait
    SQL>

# 単一文

> モジュール・プロシージャまたは埋込みホスト言語プログラムに単一SQL文を組み込みます。この文では、単一の実行SQL文を組み込むことができます。単一文が組み込まれたモジュール・プロシージャまたは埋込みプロシージャは、単一文プロシージャと呼ばれます。

> 単一文で使用できるすべてのSQL文のリストは、表1-1を参照してください。

## 環境

> 単一文は、SQLモジュール・ファイルのプロシージャ、または先頭にキーワードEXEC SQLが付いた埋込みホスト言語プログラムのいずれかで有効です。

> - モジュールSQL
>   SQLモジュール・ファイル内のモジュール・プロシージャでの単一文の使用方法の詳細は、第3.2節を参照してください。

> - 埋込みSQL
>   ホスト言語プログラム内の埋込みプロシージャでの単一文の使用方法の詳細は、第4.2節を参照してください。

## 形式

## 引数

> ### SQL文

> 単一の実行SQL文を指定します。

> 実行SQL文は、モジュールのコンパイル時に処理されますが、プログラムが実行されるまでは実行されません。複合文が埋め込まれているプロシージャがホスト言語モジュールでコールされると、単一文が実行されます。（非実行SQL文は、SQLモジュールのコンパイル時に完全に処理されるが実行時には実行されない文です。）実行SQL文と非実行SQL文の詳細は、第1.4節を参照してください。

> SQL文には、パラメータを参照する場合は常に、プロシージャの仮パラメータに指定されている名前を使用する必要があります。

## 使用方法

> - 単一文には、プロシージャごとに1つのSQL文のみを組み込むことができます。ただし、複合文を指定する場合は、1つのプロシージャに複数の文を組み込むことができます。（複合文が含まれるモジュール・プロシージャまたは埋込みプロシージャは、複数文プロシージャと呼ばれます。）現在、単一文プロシージャに課される制約の方が複数文プロシージャに課される制約より少ないですが、複数文プロシージャの方が効率的に実行されます。できるかぎり、複数文プロシージャを使用することをお薦めします。詳細は、「複合文」を参照してください。

> - 文がプロシージャに含まれる場合、セミコロンで終わる必要があります。

## 例

> 例1: 対話型SQLを使用する単一文

>     SQL> ALTER DATABASE FILENAME mf_personnel
>     cont> JOURNAL IS DISABLED;

# SIGNAL制御文

> 送信されたSQLSTATEステータス・パラメータをアプリケーションまたはSQLインタフェースに戻し、現行ルーチンおよびすべてのコール側ルーチンを終了します。

## 環境

> SIGNAL文は、次の環境の複合文で使用できます。

> - 対話型SQL内

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

> - SQLモジュールのプロシージャの一部として

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

## 形式

## 引数

> ### signal-arg

> 値式を指定します。指定した値は、CHARACTER(80) CHARACTER SET UNSPECIFIED文字列に変換され、セカンダリ・メッセージとしてクライアント・アプリケーションに返されます。値式が80文字を超える長さの文字列に変換される場合、この式は切り捨てられます。

> sql_get_error_textルーチンを使用して、アプリケーションでsignal-argテキストを抽出できます。

> ### string-literal

> SQLSTATE値を表す引用符付き文字列リテラルです。

> ### value-expr

> SQLSTATEステータス・パラメータとして使用される文字値式を想定します。指定した値式は、CHAR(5)値に変換され、SIGNALに渡されます。

> 値式の詳細は、第2.6節を参照してください。SQLSTATEの詳細は、付録Cを参照してください。

## 使用方法

> - 現行ルーチン、すべてのコール側ルーチンおよびトリガーは終了し、送信されたSQLSTATEステータス・パラメータがアプリケーションに渡されます。

> - SQLSTATE値は、SQLCODEステータス・パラメータにマップされます。
>   SQLSTATEステータス・パラメータ値が複数のSQLCODE値にマップされる場合、SQLCODEは値-1042に設定されます。

> - SQLSTATEステータス・パラメータ文字列の内容は、ANSI/ISO SQL規格によって定義され、ラテン語の大文字（A〜Z）またはアラビア語の数字（0〜9）のみが含まれる必要があります。5文字を超える長さの文字列は切り捨てられます。5文字未満の長さの文字列は空白が充填され、エラーが返される原因となります。文字列のキャラクタ・セットは、ASCII、DEC_MCS、ISOLATIN1またはISOLATIN9である必要があります。

> - SIGNALで使用される数値式は文字列に変換されますが、先頭に空白がある可能性があります。先頭の空白は、無効とみなされます。たとえば、SIGNAL 02000は無効とみなされますが、SIGNAL '02000'は受け入れられます。

> - SQLSTATE文字列に無効な文字が含まれる場合、次のエラーが生成されます。

>       %RDB-F-CONVERT_ERROR, invalid or unsupported data conversion
>       -RDMS-E-SQLSTATE_ILLCH, illegal character in SQLSTATE string passed to
>       SIGNAL routine

> - 文字値式の結果としてNULL値が生成された場合、次のエラーが生成されます。

>       %RDB-F-CONVERT_ERROR, invalid or unsupported data conversion
>       -RDMS-E-SQLSTATE_NULL, unexpected NULL passed to SIGNAL routine

> - Oracle Rdbによって返されるエラー・メッセージには、SIGNALをコールしたルーチンまたはトリガーの名前が含まれます。ルーチンが名前のない複合文または複数文プロシージャである場合、エラー・メッセージには"(unnamed)"と表示されます。次に例を示します。

>       %RDB-F-SIGNAL_SQLSTATE, routine "(unnamed)" signaled SQLSTATE "22028"

>   注意 複合文に名前を指定するには、BEGIN句またはPRAGMA句でOPTIMIZE AS句を使用します。

> - SQLアプリケーションでは、SQLSTATE変数を調べることにより、SQLまたはアプリケーションのSIGNALコールによって送信された内容を確認できます。

## 例

> 例1: SIGNAL文およびRETURN文、複数行コメント、およびストアド・ファンクションの使用

> この例では、表NEXT_KEY_TABLEを使用して、キー名およびその現行値のリストを保持しています。この例では、名前EMPLOYEE_IDを持つ単一キーのみが作成されています。ファンクションがコールされるたびにNEXT_KEY_TABLEから値がフェッチされ、次の値が返されます。指定したキーが見つからない場合、エラーが返されます（SQLSTATE 22023は「invalid parameter value」として定義されています）。

>     SQL> CREATE DOMAIN key_name
>     cont>   CHAR(31)
>     cont>   CHECK (VALUE IS NOT NULL)
>     cont>   NOT DEFERRABLE;
>     SQL> --
>     SQL> CREATE TABLE next_key_table (
>     cont>   next_key_val INTEGER NOT NULL,
>     cont>   next_key_name key_name UNIQUE);
>     SQL> --
>     SQL> INSERT INTO next_key_table (next_key_name, next_key_val)
>     cont>   VALUES ('EMPLOYEE_ID', 0);
>     1 row inserted
>     SQL> --
>     SQL> CREATE MODULE tools
>     cont>   LANGUAGE SQL
>     cont>   FUNCTION next_key (IN :key_name key_name)
>     cont>      RETURNS INTEGER
>     cont>      COMMENT IS 'This routine fetches the next value of the'/
>     cont>                 'specified entry in the sequence table.  The'/
>     cont>                 'passed name is converted to uppercase before'/
>     cont>                 'retrieval (see the DEFAULT clause for compound'/
>     cont>                 'statements).  The UPDATE ... RETURNING statement'/
>     cont>                 'is used to fetch the new value after the update.'/
>     cont>                 'If no entry exists, then an error is returned.';
>     cont>      BEGIN
>     cont>        DECLARE :rc, :new_val INTEGER DEFAULT 0;
>     cont>        DECLARE :key_name_upper key_name DEFAULT UPPER(:key_name);
>     cont>        DECLARE :invalid_parameter CONSTANT CHAR(5) = '22023';
>     cont> --
>     cont>        UPDATE next_key_table
>     cont>        SET next_key_val = next_key_val + 1
>     cont>        WHERE next_key_name = :key_name_upper
>     cont>        RETURNING next_key_val
>     cont>        INTO :new_val;
>     cont> --
>     cont>        GET DIAGNOSTICS :rc = ROW_COUNT;
>     cont>        TRACE 'NEXT_KEY is ', COALESCE(:new_val, 'NULL'), ', RC is ', :rc;
>     cont> --
>     cont>        IF :rc = 0 THEN
>     cont>            TRACE 'No entry exists for KEY_NAME: ', :key_name_upper;
>     cont>            SIGNAL :invalid_parameter;
>     cont>         ELSE
>     cont>            TRACE 'Returning new value for ', :key_name_upper, :new_val;
>     cont>            RETURN :new_val;
>     cont>        END IF;
>     cont> --
>     cont>      END;
>     cont> END MODULE;
>     SQL> --
>     SQL> CREATE TABLE employee (
>     cont>   employee_id         INTEGER,
>     cont>   last_name           CHAR(20),
>     cont>   birthday            DATE);
>     SQL> --
>     SQL> -- Turn on the TRACE flag so we can see the function working.
>     SQL> --
>     SQL> SET FLAGS 'TRACE';
>     SQL> --
>     SQL> INSERT INTO employee (employee_id, last_name, birthday)
>     cont>   VALUES (next_key('EMPLOYEE_ID'), 'Smith', DATE'1970-1-1');
>     ~Xt: NEXT_KEY is 1          , RC is 1
>     ~Xt: Returning new value for EMPLOYEE_ID                    1
>     1 row inserted
>     SQL> --
>     SQL> INSERT INTO employee (employee_id, last_name, birthday)
>     cont>   VALUES (next_key('EMPLOYEE_ID'), 'Lee', DATE'1971-1-1');
>     ~Xt: NEXT_KEY is 2          , RC is 1
>     ~Xt: Returning new value for EMPLOYEE_ID                    2
>     1 row inserted
>     SQL> --
>     SQL> INSERT INTO employee (employee_id, last_name, birthday)
>     cont>   VALUES (next_key('EMPLOYEE_ID'), 'Zonder', DATE'1972-1-1');
>     ~Xt: NEXT_KEY is 3          , RC is 1
>     ~Xt: Returning new value for EMPLOYEE_ID                    3
>     1 row inserted
>     SQL> --
>     SQL> SELECT * FROM employee ORDER BY EMPLOYEE_ID;
>      EMPLOYEE_ID   LAST_NAME              BIRTHDAY
>                1   Smith                  1970-01-01
>                2   Lee                    1971-01-01
>                3   Zonder                 1972-01-01
>     3 rows selected
>     SQL> --
>     SQL> -- Show the error if the unknown key_name is passed.
>     SQL> --
>     SQL> INSERT INTO employee (employee_id, last_name, birthday)
>     cont>   VALUES (next_key('EMPLOYEEID'), 'Zonder', DATE'1972-1-1');
>     ~Xt: NEXT_KEY is 0          , RC is 0
>     ~Xt: No entry exists for KEY_NAME: EMPLOYEEID
>     %RDB-E-SIGNAL_SQLSTATE, routine "NEXT_KEY" signaled SQLSTATE "22023"

> 例2: セカンダリ・エラーの指定

>     SQL> BEGIN
>     SQL> SIGNAL SQLSTATE 'RR000' (' Compound Statement Failed');
>     cont> END;
>     %RDB-E-SIGNAL_SQLSTATE, routine "(unnamed)" signaled SQLSTATE "RR000"
>     -RDB-I-TEXT,  Compound Statement Failed

# START TRANSACTION文

> 指定した属性を使用してトランザクションを開始します。DEFAULTを指定すると、属性はユーザーのプロファイルから導出されます。

## 環境

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

> - 対話型SQL内

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

> - SQLモジュールのプロシージャの一部として

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

## 形式

## 引数

> ### DEFAULT

> DEFAULTキーワードを使用すると、ユーザー固有のデフォルト・トランザクションが開始されます。このデフォルトは、現在のセッション・ユーザーのプロファイルに定義されています。何も指定しない場合、READ ONLYトランザクションが開始されます。

>     SQL> CREATE PROFILE READ_USERS
>     cont>   DEFAULT TRANSACTION READ ONLY WAIT 10;
>     SQL> ALTER USER JONES PROFILE READ_USERS;

> JONESによって実行されるSTART DEFAULT TRANSACTION文により、READ ONLY WAIT 10トランザクションが開始されます。

> プロファイルの詳細は、「ALTER PROFILE文」および「CREATE PROFILE文」を参照してください。

> ### ISOLATION LEVEL READ COMMITTED

> ### ISOLATION LEVEL REPEATABLE READ

> ### ISOLATION LEVEL SERIALIZABLE

> SQLトランザクションでのデータベース操作が、同時実行トランザクションでのデータベース操作による影響を受ける程度を定義します。これにより、データベースでデータの整合性が保護される程度が決まります。

> Oracle Rdbでは、分離レベルとしてREAD COMMITTED、REPEATABLE READおよびSERIALIZABLEをサポートしています。Oracle RdbデータベースでSQLを使用する場合、デフォルトでは、トランザクションは分離レベルSERIALIZABLEで実行されます。分離レベルが高くなるほど、トランザクションが現在実行中の他のトランザクションから分離される程度が高くなります。分離レベルにより、同時トランザクションの実行時に発生が許容される現象のタイプが決まります。トランザクションのSQL分離レベルは、次の2つの現象によって定義されます。

> - ノンリピータブル・リード
>   1つのトランザクション内でSQL操作によって表内の同じ行が2回読み取られるときに異なる結果が返されるのを許可します。ノンリピータブル・リードが発生するのは、トランザクション読取りの間に別のトランザクションによって行が変更され、この変更がコミットされる場合です。

> - ファントム
>   1つのトランザクション内でSQL操作によってデータ値の範囲取得（または同等データの存在チェック）が2回行われるときに異なる結果が返されるのを許可します。ファントムが発生するのは、範囲取得の実行の間に別のトランザクションによって新規レコードが挿入され、この挿入がコミットされる場合です。

> 許可される現象は、分離レベルごとに異なります。表6-22は、START TRANSACTION文で明示的に指定可能な分離レベルで許可される現象を示しています。

> 表6-22 各分離レベルで許可される現象
> 分離レベル | ノンリピータブル・リード の許可 | ファントム の許可
> --- | --- | ---
> READ COMMITTED | ○ | ○
> REPEATABLE READ | × | ○
> SERIALIZABLE | × | ×

> 常に分離レベルSERIALIZABLEで実行される読取り専用トランザクションの場合、スナップショットを有効にすると、COMMIT文を発行する前の別のユーザーによる変更が表示されないことがデータベース・システムによって保証されます。

> トランザクションにおける分離レベルの指定の詳細は、『Oracle Rdb7 Guide to SQL Programming』を参照してください。

> ### READ ONLY

> 読取り専用トランザクションの開始時にデータベースのスナップショットを取得します。使用している表の行は他のユーザーによる更新が可能ですが、トランザクションで取得される行は、トランザクションの開始時に存在していた行です。読取り専用トランザクションで、行を更新、挿入または削除したり、データ定義文を実行できません。ただし、ローカル一時表の宣言や、作成または宣言された一時表でのデータの変更は例外です。読取り専用トランザクションは、暗黙的に分離レベルとしてシリアライズ可能になります。

> 読取り専用トランザクションではデータベースのスナップショット（.snp）・バージョンが使用されるため、トランザクション中に他のユーザーによって行われる変更やコミットは表示されません。読取り専用トランザクションを使用すると、行ロックのオーバーヘッドを発生させずにデータの読取りが可能です。（RESERVING句で指定する表のスナップショットの保持によるオーバーヘッドは発生しますが、このオーバーヘッドは同等の読取り/書込みトランザクションの場合よりも小さくなります。）

> 読取り専用トランザクションは本質的に制限されているため、いくつかの制限が課されます。これらの制限は、「使用方法」を参照してください。

> ### READ WRITE

> データの取得および更新における整合性を確保するためにSQLのロック・メカニズムを使用するように指定します。デフォルト・トランザクションは、読取り/書込みです。読取り/書込みトランザクション・モードを使用するのは、次の操作が必要な場合です。

> - データの挿入、更新または削除

> - 取得時に正確であることが保証されているデータの取得

> - SQLデータ定義文の使用

> 読取り/書込みトランザクションでの行の読取り時に、他のユーザーはこの行を更新できません。状況によっては、明示的に読み取っていない行がロックされる場合があります。

> - 問合せで索引を使用せずに表をスキャンする場合、分離レベルとしてシリアライズ可能を保持するためにレコード・ストリーム内のすべての行がロックされます。

> - 問合せで索引を使用する場合、索引の一部がロックされる場合があります。これには、複数行のロックと同じ効果があります。

## 使用方法

> - START TRANSACTION文の操作は、SET TRANSACTION文と類似しています。つまり、READ WRITEトランザクション・モードまたはREAD ONLYトランザクション・モードに加えて、様々な分離レベルを指定できます。

> - START TRANSACTION文では、transaction-mode句およびisolation-level句は1回のみ使用できます。

> - この文では、BATCH UPDATEモードはサポートされません。これは、このモードがOracle Rdbの拡張機能であるため、SET TRANSACTION文およびDECLARE TRANSACTION文でのみサポートされているためです。

> - Oracle RdbではSTART TRANSACTION文が拡張されているため、すべてのトランザクション・オプションを省略できます。transaction-modeを省略すると、READ WRITEにデフォルト設定されます。isolation-levelを省略すると、ISOLATION LEVEL SERIALIZABLEにデフォルト設定されます。このため、すべてのオプションを省略すると、トランザクションはREAD WRITE ISOLATION LEVEL SERIALIZABLEにデフォルト設定されます。

> - 複数のデータベースが現在アタッチされている場合、データベース全体にまたがるトランザクションが、指定した属性またはデフォルト属性を使用して開始されます。

## 例

> 例1: 複数文プロシージャでの、または単一文としてのデフォルト・トランザクションの開始

>     SQL> START DEFAULT TRANSACTION;
>     SQL>
>     SQL> BEGIN
>     cont> COMMIT;
>     cont> START DEFAULT TRANSACTION;
>     cont> END;
>     SQL>
>     SQL> ROLLBACK;

> 例2: START TRANSACTION文の複数のバリエーションの開始

>     SQL> START TRANSACTION READ WRITE,
>     cont>   ISOLATION LEVEL READ COMMITTED;
>     SQL> COMMIT;
>     SQL>
>     SQL> -- Defaults to serializable
>     SQL> START TRANSACTION READ WRITE;
>     SQL> COMMIT;
>     SQL>
>     SQL> -- Defaults to read write
>     SQL> START TRANSACTION ISOLATION LEVEL READ COMMITTED;
>     SQL> ROLLBACK;
>     SQL>
>     SQL> -- Defaults to read write serializable
>     SQL> START TRANSACTION;
>     SQL>
>     SQL> BEGIN
>     cont> COMMIT;
>     cont> START TRANSACTION
>     cont>     ISOLATION LEVEL READ COMMITTED,
>     cont>     READ WRITE;
>     cont> END;
>     SQL> COMMIT;