例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;
送信された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に渡されます。
- 現行ルーチン、すべてのコール側ルーチンおよびトリガーは終了し、送信された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
指定した属性を使用してトランザクションを開始します。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;