トレース拡張デバッグ・フラグが設定された後に値をトレース・ログ・ファイルに書き込みます。TRACE制御文を使用すると、複数の値式を指定できます。この文により、評価対象の値式ごとに値がログ・ファイルに格納されます。トレース・ロギングを使用すると、複雑な複数文プロシージャをデバッグしやすくなります。
TRACE制御文は、次の環境の複合文で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
value-expr
単一値の表現または計算に使用される記号または記号の文字列を指定します。SQLで提供される様々な値式の詳細は、第2.6節を参照してください。
- デバッグ・フラグが定義されていない場合、TRACE制御文には効力がありません。
- TRACE文は、次のいずれかの方法によって有効になります。
- SET FLAGS 'TRACE'文
- 'TRACE'キーワードが含まれるRDMS$SET_FLAGS論理名の定義
- Xt文字列(Xは大文字でtは小文字)が含まれるRDMS$DEBUG_FLAGS論理名の定義
出力は、RDMS$DEBUG_FLAGS_OUTPUT論理名を使用してリダイレクトできます。論理名の詳細は、付録Eおよび『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。- INパラメータ、OUTパラメータおよびINOUTパラメータをトレースできます。次に例を示します。
SQL> CREATE MODULE m1 cont> LANGUAGE SQL cont> PROCEDURE p1 (IN :a INTEGER, OUT :b REAL); cont> BEGIN cont> SET :b = :a; cont> TRACE :a, :b; cont> END; cont> END MODULE; SQL> SET FLAGS 'TRACE'; SQL> DECLARE :res real; SQL> CALL p1 (10, :res); ~Xt: 10 1.0000000E+01 RES 1.0000000E+01
- TRACE文がアクティブ化されている場合、TRACE文内の問合せはプロシージャの問合せアウトラインにマージされます。「例」の項の「例2」は、TRACE文が無効の場合に問合せが1つ含まれる問合せアウトラインを示しています。
- いずれかのTRACE文に副問合せが含まれている場合、TRACEが有効および有効でない状態で問合せを実行するため、2つの問合せアウトラインが必要であれば、これを別々のモードで使用することをお薦めします。つまり、TRACEが有効な場合、TRACEが有効な状態の問合せアウトラインに一致するようにMODEを定義します。
$ DEFINE RDMS$DEBUG_FLAGS_OUTPUT TRACE.DAT $ DEFINE RDMS$SET_FLAGS "TRACE, MODE(10)"
またはSET FLAGS文を使用します。この文を使用すると、対話型セッション内で、または動的SQLを介してTRACEフラグを有効化し、MODEを確立できます。この方法を使用すると、TRACEが有効でも無効でも問合せを実行できます。- COALESCEファンクションを使用して、NULL式を書式設定します。たとえば、TRACE COALESCE(LAST_NAME, 'NULL');のように使用します。
例1: 複数文プロシージャのトレース
SQL> ATTACH 'FILENAME MF_PERSONNEL'; SQL> SET FLAGS 'TRACE'; SQL> DECLARE :i INTEGER; SQL> BEGIN cont> WHILE :i <= 10 cont> LOOP cont> TRACE ':i is', :i; cont> SET :i = :i +1; cont> END LOOP; cont> END; ~Xt: :i is 0 ~Xt: :i is 1 ~Xt: :i is 2 ~Xt: :i is 3 ~Xt: :i is 4 ~Xt: :i is 5 ~Xt: :i is 6 ~Xt: :i is 7 ~Xt: :i is 8 ~Xt: :i is 9 ~Xt: :i is 10
例2: TRACE文が無効の場合の問合せアウトラインの生成
SQL> DECLARE :LN CHAR(40); SQL> SET FLAGS 'NOTRACE'; SQL> BEGIN cont> TRACE 'Jobs Held: ', cont> (SELECT COUNT(*) cont> FROM JOB_HISTORY cont> WHERE EMPLOYEE_ID = '00201'); cont> SELECT LAST_NAME cont> INTO :LN cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID = '00201'; cont> END; -- Oracle Rdb Generated Outline : create outline QO_A17FA4B41EF1A68B_00000000 id 'A17FA4B41EF1A68B966C1A0B083BFDD4' mode 0 as ( query ( -- Select subquery ( EMPLOYEES 0 access path index EMPLOYEES_HASH ) ) ) compliance optional ; SQL>
TRACEが有効な場合に問合せアウトラインが生成されると、問合せはTRACE文の副問合せ用、およびシングルトンSELECT文用の2つが表示されます。
この2番目の問合せアウトラインは、TRACE文が無効のまま実行時に使用されると、問合せに適用できません。アウトラインは準拠が任意で作成されているため、この問合せアウトラインは破棄され、新しい計画が計算されます。準拠が必須の場合、問合せは失敗します。例3を参照してください。
SQL> DECLARE :LN CHAR(40); SQL> SET FLAGS 'TRACE'; SQL> BEGIN cont> TRACE 'Jobs Held: ', cont> (SELECT COUNT(*) cont> FROM JOB_HISTORY cont> WHERE EMPLOYEE_ID = '00201'); cont> SELECT LAST_NAME cont> INTO :LN cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID = '00201'; cont> END; -- Oracle Rdb Generated Outline : create outline QO_A17FA4B41EF1A68B_00000000 id 'A17FA4B41EF1A68B966C1A0B083BFDD4' mode 0 as ( query ( -- Trace subquery ( JOB_HISTORY 0 access path index JOB_HISTORY_HASH ) ) query ( -- Select subquery ( EMPLOYEES 0 access path index EMPLOYEES_HASH ) ) ) compliance optional ; ~Xt: Jobs Held: 4 SQL>
例3: トレース無効時に作成されたアウトラインの使用時におけるトレースの有効化
この例は、TRACE文を有効にしたときに、TRACEの無効時に定義された問合せアウトラインに与える影響を示しています。
SQL> DECLARE :LN CHAR(40); SQL> SQL> BEGIN cont> TRACE 'Jobs Held: ', cont> (SELECT COUNT(*) cont> FROM JOB_HISTORY cont> WHERE EMPLOYEE_ID = '00201'); cont> SELECT LAST_NAME cont> INTO :LN cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID = '00201'; cont> END; ~S: Outline QO_A17FA4B41EF1A68B_00000000 used ~S: Outline/query mismatch; assuming JOB_HISTORY 0 renamed to EMPLOYEES 0 ~S: Full compliance with the outline was not possible Get Retrieval by index of relation EMPLOYEES Index name EMPLOYEES_HASH [1:1] Direct lookup
表のメタデータ定義を保持しながら、表内のデータを削除します。これには、均一の領域でデータを高速に削除でき、依存性データが変更されないという利点があります。
TRUNCATE TABLE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
table-name
切り捨てる表の名前を指定します。
- TRUNCATE TABLE文により、次がリセットされます。
- すべての索引
- 表の記憶域マップ
- IDENTITY列の順序
- TRUNCATE TABLE文では、次は行われません。
- 削除トリガーの実行
- プロシージャの無効化
- 指定した表を参照するストアド・ルーチンおよび問合せアウトラインの無効化
- TRUNCATEはデータ定義文であるため、表に対する排他アクセスが必要です。
- 表に対するDELETE権限、DROP権限およびCREATE権限が必要です。
- 次の場合、エラー・メッセージとともにTRUNCATE TABLE文は失敗します。
- RDB$SYSTEM記憶域が読取り専用に設定されている場合
- 指定した表がビューの場合
- 指定した表がデータ定義用として予約されている場合
- 指定した表がシステム表の場合
- TRUNCATE TABLE文は、作成または宣言されたローカル一時表ではサポートされません。
- 切り捨てられた表を参照する制約はすべて切捨て操作の後に(遅延不可として)再検証されるため、データベースの整合性が保持されます。
制約の検証が失敗すると、TRUNCATE文は自動的にロールバックされます。次に例を示します。
SQL> CREATE TABLE test1 cont> (col1 REAL); SQL> SQL> CREATE TABLE test2 cont> (col1 REAL, cont> REFERENCES TEST1 (COL1)); SQL> COMMIT; SQL> SQL> INSERT INTO test1 VALUES (1); 1 row inserted SQL> INSERT INTO test2 VALUES (1); 1 row inserted SQL> COMMIT; SQL> TRUNCATE TABLE test1; -RDB-E-INTEG_FAIL, violation of constraint TEST2_CHECK1 caused operation to fail -RDB-F-ON_DB, on database DISK1:[TEST]MF_PERSONNEL.RDB;
- 表を切り捨てても、RDB$WORKLOADシステム表に収集されたワークロード情報は削除されません。廃止されたデータは、RMU Delete Optimizer_Statisticsコマンドを使用して削除できます。詳細は、『Oracle Rdb for OpenVMS Oracle RMUリファレンス・マニュアル』を参照してください。
- 表に1つ以上のLIST OF BYTE VARYING列が含まれる場合、TRUNCATE TABLE文で表の各行を読み取り、すべてのLIST値のポインタを記録する必要があります。このリストは、COMMIT時に処理され、LIST列データを削除します。したがって、データベース管理者は、表の切捨て時にこの時間も考慮する必要があります。
削除されたLIST列では、表の各行を更新し、NULLに設定する必要があるため、EXCLUSIVE WRITEに対する表を予約することをお薦めします。このアクションにより、コミット時の処理のポインタがキューに入ります。予約モードにより、スナップショット・ファイルのI/Oが削除され、ロック・リソースの粒度が下げられ、仮想メモリーの使用率が低減されます。
LISTデータは表の外部に格納されるため、データベースにRESTRICTED ACCESS句でアタッチすることによりパフォーマンスが向上します。この句は、EXCLUSIVEアクセスに対して全LIST記憶域を予約するという副次的な効果があるため、LISTデータ削除中のスナップショットのI/Oが削除されます。
例1: メタデータ定義を保持した状態での表内のデータの削除次の例は、メタデータ定義を保持しながらSALARY_HISTORY表からデータを削除する方法を示しています。
SQL> TRUNCATE TABLE salary_history; SQL> -- SQL> -- The table still exists, but the rows are deleted. SQL> -- SQL> SELECT * FROM salary_history; 0 rows selected SQL> SHOW TABLE (COLUMN) salary_history; Information for table SALARY_HISTORY Columns for table SALARY_HISTORY: Column Name Data Type Domain ----------- --------- ------ EMPLOYEE_ID CHAR(5) ID_DOM Foreign Key constraint SALARY_HISTORY_FOREIGN1 SALARY_AMOUNT INTEGER(2) SALARY_DOM SALARY_START DATE VMS DATE_DOM SALARY_END DATE VMS DATE_DOM
ストアド・プロシージャの起動、およびモジュールまたは埋込みSQLプログラムのプロシージャのテスト用として使用された、対話型SQLおよび動的SQLから変数定義を削除します。
UNDECLARE文は次の環境で使用できます。
- 対話型SQL内
- 動的SQLで動的に実行される文として
variable-name
ローカル変数の名前を指定します。
例1: 対話型SQLにおける変数の宣言の解除
SQL> ATTACH 'FILENAME personnel'; SQL> SQL> DECLARE :X INTEGER; SQL> DECLARE :Y CHAR(10); SQL> SQL> BEGIN cont> SET :X = 100; cont> SET :Y = 'Active'; cont> END; SQL> PRINT :X, :Y; X Y 100 Active SQL> SHOW VARIABLES X INTEGER Y CHAR(10) SQL> UNDECLARE :X, :Y;
表またはビューの行を変更します。
UPDATE文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
column-name
値を変更する列の名前を指定します。correlation-name
UPDATE文の条件で表または表を識別するために使用可能な名前を指定します。相関名の詳細は、第2.2.4.1項を参照してください。CURRENT OF cursor-name
WHERE句でCURRENT OF cursor-nameを使用すると、指定したカーソルが配置されている行のみが変更されます。UPDATE文に指定するカーソルは、次の条件を満たしている必要があります。
- カーソルは、DECLARE CURSOR文またはFOR文に事前に指定されている必要があります。
- カーソルは、オープンしている必要があります。
- カーソルは、行にある必要があります。
- DECLARE CURSOR文内のSELECT文のFROM句は、UPDATE文のターゲットである表またはビューを参照している必要があります。
DEFAULT
列またはドメインに定義されているDEFAULTが割り当てられます。DEFAULTが定義されていない場合、NULLが想定されます。UPDATE文でDEFAULT句を使用すると、次のいずれかが適用されます。
- 列にDEFAULT属性がある場合は、UPDATE実行中にその値が適用されます。
- または、列にAUTOMATIC属性がある場合は、UPDATE実行中にその値が適用されます。これは、これらの列が通常の処理時には読取り専用であるためにSET FLAGS 'AUTO_OVERRIDE'が使用されている場合にのみ発生します。
- それ以外の場合は、UPDATE実行中にNULLが適用されます。
INTO parameter
指定された値を指定されたパラメータに挿入します。INTOパラメータ句は、対話型SQLではオプションです。この場合、返された値が表示されます。
NULL
NULLキーワードを指定します。NULLを指定する列にはNULL値が割り当てられます。NULL値が割り当てられる列では、NULL値を許可すると定義する必要があります(NOT NULL句がないCREATE TABLE文またはALTER TABLE文で定義)。OPTIMIZE AS query-name
名前を問合せに割り当てます。OPTIMIZE FOR
OPTIMIZE FOR句は、選択式を指定する文の優先オプティマイザ計画を指定します。次のオプションを使用できます。
- FAST FIRST
FAST FIRST用に最適化された問合せが、これにより全体のスループットが低下しても、できるかぎり速やかにデータをユーザーに返します。
問合せが早期に取り消されることがある場合は、FAST FIRSTの最適化を指定する必要があります。FAST FIRST最適化の有力な候補は、レコードのグループをユーザーに表示する対話型アプリケーションです。このようなアプリケーションでは、ユーザーは最初の数画面の確認後、問合せを中断することもできます。たとえば、シングルトンSELECT文では、FAST FIRST最適化がデフォルトで設定されます。
最適化計画を明示的に設定しない場合は、FAST FIRSTがデフォルトとなります。- TOTAL TIME
アプリケーションをバッチで実行し、問合せのすべてのレコードにアクセスして更新またはレポートの書込みを行う場合は、TOTAL TIME最適化を指定する必要があります。TOTAL TIME最適化は、ほとんどの問合せに効果があります。- SEQUENTIAL ACCESS
順次アクセスの使用を強制します。このオプションは、厳密なパーティション化機能を使用する表では特に有用です。
OPTIMIZE USING outline-name
問合せのアウトラインIDとアウトラインのIDが異なっている場合でも、UPDATE文で使用する問合せアウトラインに明示的に名前を付けます。OPTIMIZE WITH
以前のRdbバージョンで使用されていたDEFAULT、行数が少ない方が選択されると仮定するAGGRESSIVE、問合せにリテラルを使用して索引で予備評価を行うSAMPLEDの3つの最適化制御のいずれかを選択します。predicate
WHERE句に条件が含まれる場合、条件がTRUEとなるターゲット表のすべての行が変更されます。条件に指定した列は、ターゲット表またはターゲット・ビューの列である必要があります。ターゲット表は、条件内の列選択式では指定できません。
条件の詳細は、第2.7節を参照してください。
RETURNING value-expr
値式で指定されている列の値を返します。DBKEYを指定すると、更新される行のデータベース・キー(dbkey)が返されます。DBKEYの値が有効な場合は、後続の問合せでDBKEYの値を使用して行に直接アクセスできます。LIST OF BYTE VARYINGデータ型の列のセグメントへの値の割当てに使用されるUPDATE文では、RETURNING DBKEY句は無効です。
RETURNING句を指定する場合、1行のみを更新できます。
SET
表またはビュー内のどの列でどのような値を取得するかを指定します。変更する列ごとに、列名、および値式、NULLキーワードまたはDEFAULTキーワードのいずれかを指定する必要があります。等号記号の後ろにある値が、等号記号の前にある列に割り当てられます。table-name
view-name
変更するターゲット表またはターゲット・ビューの名前を指定します。value-expr
変更した列の新規の値を指定します。値式に指定した列は、UPDATEキーワードの後ろに指定した表またはビューの列である必要があります。この値の指定には、パラメータ、修飾パラメータ、列選択式、値式またはデフォルト値を使用できます。パラメータ、修飾パラメータ、列選択式、値式およびデフォルト値の詳細は、第2章を参照してください。
WHERE
SET句に指定する値に応じて変更されるターゲット表またはターゲット・ビューの行を指定します。WHERE句を省略した場合、SQLではターゲット表またはターゲット・ビューのすべての行が変更されます。WHERE句には条件またはカーソル名を指定できます。
- UPDATE文を使用してビューの行を変更すると、このビューの元になる実表の行が変更されます。このため、UPDATE文はすべてのビューに対しては使用できません。ビューの値の挿入、更新および削除のルールは、「CREATE VIEW文」を参照してください。
- 適切なFOR UPDATE句を使用して宣言されたカーソルを参照するためにWHERE CURRENT OFを指定するUPDATE文は必要ありません。
- FOR UPDATE句には含まれない列をSET句に指定した場合、警告メッセージが発行され、更新変更が続行されます。
- DECLARE CURSOR文にFOR UPDATE句がない場合、任意の列を更新できます。この場合、メッセージは表示されません。
- 埋込みUPDATE文のCURRENT OF句では、動的SELECT文に基づいてカーソルを指定できません。CURRENT OF句で動的SELECT文に基づいてカーソルを参照するには、UPDATE文も準備して動的に実行する必要があります。
- 埋込みUPDATE文のCURRENT OF句では、読取り専用カーソルを指定できません。読取り専用カーソルの詳細は、「DECLARE CURSOR文」の「使用方法」を参照してください。
- UPDATE文で列名を指定するときに、列名がパラメータと同じ場合は、列名とともに相関名または表名を使用する必要があります。
- OPTIMIZE句とWHERE CURRENT OF句を両方指定することはできません。
- compound-use-statementにはアウトライン名を指定できません。複合文の詳細は、「複合文」を参照してください。
- アウトラインが存在する場合は、OPTIMIZE USING句で指定されているアウトラインが使用されます。ただし、アウトラインのディレクティブを1つ以上順守できない場合は除きます。既存のアウトラインを使用できない場合は、エラー・メッセージが発行されます。
存在しないアウトラインの名前を指定すると、問合せがコンパイルされ、そのアウトライン名は無視され、問合せと同じアウトラインIDを持つ既存のアウトラインが検索されます。同じアウトラインIDのアウトラインが検出されると、そのアウトラインのディレクティブを使用して問合せを実行しようとします。同じアウトラインIDを持つアウトラインが検出されない場合、問合せ実行のための計画がオプティマイザで選択されます。
問合せアウトラインの詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。
例1: 対話型SQLでのUPDATE文の使用次の対話型SQLの例は、EMPLOYEE_ID 00164を持つ従業員の住所を変更し、変更内容を確認しています。
SQL> UPDATE EMPLOYEES cont> SET ADDRESS_DATA_1 = '16 Ridge St.' cont> WHERE EMPLOYEE_ID = '00164'; 1 row updated SQL> SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, ADDRESS_DATA_1 cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID = '00164'; EMPLOYEE_ID FIRST_NAME LAST_NAME ADDRESS_DATA_1 00164 Alvin Toliver 16 Ridge St. 1 row selected
例2: プログラムでのUPDATE文の使用
次の例は、埋込みSQL文でホスト言語変数を使用して従業員のステータス・コードを更新する方法を示しています。
DISPLAY "Enter employee's ID number: " WITH NO ADVANCING. ACCEPT ID. DISPLAY "Enter new status code: " WITH NO ADVANCING. ACCEPT STATUS-CODE. EXEC SQL DECLARE TRANSACTION READ WRITE END-EXEC EXEC SQL UPDATE EMPLOYEES SET STATUS_CODE = :STATUS-CODE WHERE EMPLOYEE_ID = :ID END-EXEC EXEC SQL COMMIT END-EXEC
埋込みSQL文の結果として次のいずれかの例外条件が発生したときにホスト言語プログラムが採用する実行パスを指定します。
- 不明な行
- エラー条件
- 警告条件
これらの条件において、WHENEVER文により、プログラムの実行を続行するか、プログラムの別の部分に分岐するように指定します。
WHENEVER文は、ホスト言語プログラムでのみ発行できます。
CONTINUE
エラーが生成された文に続く次の順次処理文の実行を続行するように指定します。GOTO host-label-name
GOTO host-label-number
ホスト・ラベルによって識別される文に分岐するように指定します。ホスト・ラベルの形式は、ホスト言語によって異なります。コロン(:)は、名前によって表されるホスト・ラベルの前で使用できますが、数値によって表されるホスト・ラベルの前では使用できません。NOT FOUND
結果表のすべての行が処理されるときに返される例外条件を示します。
- FETCH文、UPDATE文またはDELETE文で参照されるカーソルが最後の行に後ろに配置される場合
- 問合せで空の結果表が指定される場合
これは、値100のSQLCODE変数、値'02000'のSQLSTATE変数、およびRDB$_STREAM_EOFエラーによって識別される条件と同じです。
SQLERROR
任意のエラー条件を示します。WHENEVER文のSQLERROR引数の場合、エラー条件は、SQLCODEに負の値を返す任意の条件として定義されます。SQLCODEフィールドが負の値になる条件のリストは、付録Cを参照してください。SQLWARNING
任意の警告条件を示します。SQLSTATEステータス・パラメータに関する警告の原因となる条件のリストは、付録Cを参照してください。
- WHENEVER文の使用はオプションです。例外条件のクラスに対するWHENEVER文を省略することは、この条件のクラスに対してCONTINUE引数を指定することと同じです。
- WHENEVER文は実行可能ではありません。WHENEVER文は、プログラムのプリコンパイル時に評価されます。つまり、特定のWHENEVER文の有効範囲は、ホスト・プログラム内の条件文では制御できません。特定のWHENEVER文は、ソース・プログラムの順次処理で同じ例外条件についてプリコンパイラで次のWHENEVER文が出現するまではすべての実行SQL文に影響します。
- 例外条件のクラスに対してWHENEVER...GOTO文を指定した後、これを無効にするには、この条件のクラスに対してWHENEVER...CONTINUE文を使用します。
- ANSI/ISO 1989規格では、GOTO句のホスト・ラベル名の前にコロン(:)が必要です。現在のANSI/ISO SQL規格では、このコロンは使用できません。
例1: PL/IプログラムでのWHENEVER文の使用
/* When an SQL statement results in an RDB$_STREAM_EOF error, the program branches to LABEL_NOT_FOUND: */ EXEC SQL WHENEVER NOT FOUND GOTO LABEL_NOT_FOUND; /* When an SQL statement results in a warning severity error condition, the program branches to LABEL_ERROR: */ EXEC SQL WHENEVER SQLWARNING GOTO LABEL_ERROR; /* When an SQL statement results in an error severity exception condition, the program branches to LABEL_ERROR: */ EXEC SQL WHENEVER SQLERROR GOTO LABEL_ERROR;