ヘッダーをスキップ

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

戻る | 次へ |

    SQL> alter index PERSON_INDEX_S
    cont>     rebuild partition P3;
    %RDB-W-META_WARN, metadata successfully updated with the reported warning
    -RDMS-W-IDXBLDPEND, index in build pending state - maintenance is disabled

- BUILD ALLおよびREBUILD ALL操作は、索引のメンテナンスを自動的に有効にします。

- ALTER INDEX文を使用して、DATA DEFINITIONモードで予約された表の索引のすべてまたは一部を作成できます。
  次の句がサポートされています。

  - BUILD PARTITIONおよびBUILD ALL PARTITIONS

  - REBUILD PARTITIONおよびREBUILD ALL PARTITIONS

  - TRUNCATE PARTITIONおよびTRUNCATE ALL PARTITIONS

  - COMMENT IS

  BUILD演算子およびREBUILD PARTITION演算子は、新規の索引パーティションの構築にI/Oを消費する可能性があるため、同時実行が最も適しています。

  ## 例

  > 例1: 索引の無効化

  > 次の例では、後でデータベースの表がオフラインになった時に削除できるように索引を無効にする方法を示します。

  >     SQL> alter index COLL_COLLEGE_CODE
  >     cont> maintenance is disabled;
  >     SQL> show index COLL_COLLEGE_CODE
  >     Indexes on table COLLEGES:
  >     COLL_COLLEGE_CODE               with column COLLEGE_CODE
  >       No Duplicates allowed
  >       Type is Sorted
  >       Key suffix compression is DISABLED
  >       Index is no longer maintained
  >       Node size  430

  > 例2: 一意索引から非一意索引への変更

  >     SQL> show table (index) DEPARTMENTS
  >     Information for table DEPARTMENTS

  >     Indexes on table DEPARTMENTS:
  >     DEPARTMENTS_INDEX               with column DEPARTMENT_CODE
  >       No Duplicates allowed
  >       Type is Sorted
  >       Key suffix compression is DISABLED
  >       Node size  430

  >     SQL> insert into DEPARTMENTS (DEPARTMENT_CODE) values ('SUSO');
  >     %RDB-E-NO_DUP, index field value already exists;
  >     duplicates not allowed for DEPARTMENTS_INDEX
  >     SQL> alter index DEPARTMENTS_INDEX duplicates are allowed;
  >     SQL> insert into DEPARTMENTS (DEPARTMENT_CODE) values ('SUSO');
  >     1 row inserted
  >     SQL> show table (index) DEPARTMENTS
  >     Information for table DEPARTMENTS

  >     Indexes on table DEPARTMENTS:
  >     DEPARTMENTS_INDEX               with column DEPARTMENT_CODE
  >       Duplicates are allowed
  >       Type is Sorted
  >       Key suffix compression is DISABLED
  >       Node size  430

  > 例3: 最後のパーティションの前後への索引パーティションの追加

  >     SQL> CREATE UNIQUE INDEX EMPLOYEES_INDEX
  >     cont>     ON EMPLOYEES (EMPLOYEE_ID)
  >     cont>     TYPE IS HASHED
  >     cont>     STORE USING (EMPLOYEE_ID)
  >     cont>         IN JOBS WITH LIMIT OF ('00999');
  >     SQL> COMMIT;
  >     SQL> -- To add a partition before the final partition requires
  >     SQL> -- that the final partition (which now follows the new partition)
  >     SQL> -- be scanned and matching keys moved to the new partition.
  >     SQL> SET TRANSACTION READ WRITE
  >     cont>   RESERVING EMPLOYEES for EXCLUSIVE WRITE;
  >     SQL> SET FLAGS INDEX_STATS;
  >     SQL> ALTER INDEX EMPLOYEES_INDEX
  >     cont>     ADD PARTITION NEW_EMPS_200
  >     cont>       USING (EMPLOYEE_ID)
  >     cont>       IN EMP_INFO WITH LIMIT OF ('00200');
  >     ~Ai alter index "EMPLOYEES_INDEX" (hashed=1, ordered=0)
  >     ~Ai add partition "NEW_EMPS_200" : area "EMP_INFO"
  >     ~Ai storage area "EMP_INFO" larea=85
  >     ~Ai splitting partition #1
  >     ~Ai split complete: total 100 keys, moved 37 (dups 0)
  >     ~Ai reads: async 136 synch 30, writes: async 57 synch 0
  >     SQL> COMMIT;
  >     SQL> -- Now add a partition after the final partition of
  >     SQL> -- the index. This requires no I/O to the partition because
  >     SQL> -- there is no following partition and therefore no keys
  >     SQL> -- to be moved.
  >     SQL> SET TRANSACTION READ WRITE
  >     cont>   RESERVING EMPLOYEES FOR EXCLUSIVE WRITE;
  >     SQL> ALTER INDEX EMPLOYEES_INDEX
  >     cont>     ADD PARTITION NEW_EMPS_1400
  >     cont>       USING (EMPLOYEE_ID)
  >     cont>       IN EMPIDS_OVER WITH LIMIT OF ('01400');
  >     ~Ai alter index "EMPLOYEES_INDEX" (hashed=1, ordered=0)
  >     ~Ai add partition "NEW_EMPS_1400" : area "EMPIDS_OVER"
  >     ~Ai storage area "EMPIDS_OVER" larea=122
  >     ~Ai adding new final partition 3
  >     SQL> COMMIT;
  >     SQL> -- Show the index.  It shows the ADD PARTITION syntax appended
  >     SQL> -- to the original source of the index.
  >     SQL> SHOW INDEX EMPLOYEES_INDEX
  >     Indexes on table EMPLOYEES:
  >     EMPLOYEES_INDEX                  with column EMPLOYEE_ID
  >       No Duplicates allowed
  >       Type is Hashed Scattered
  >       Key Suffix Compression is DISABLED
  >     Store clause:           STORE using (EMPLOYEE_ID)
  >                                  in JOBS with limit of ('00999')
  >                             Add Partition partition NEW_EMPS_200
  >                             using (EMPLOYEE_ID)
  >                             in EMP_INFO with limit of ('00200')
  >                             Add Partition partition NEW_EMPS_1400
  >                             using (EMPLOYEE_ID)
  >                             in EMPIDS_OVER with limit of ('01400')

  > 例4: パーティション名の変更

  >     $ rmu /extract /item=index mf_personnel.rdb
  >     .
  >     .
  >     .
  >     create unique index EMPLOYEES_HASH
  >         on EMPLOYEES (
  >         EMPLOYEE_ID)
  >         type is HASHED
  >         store
  >             using (EMPLOYEE_ID)
  >                 in EMPIDS_LOW(
  >                     partition "SYS_P00076"
  >                     )
  >                     with limit of ('00200')
  >                 in EMPIDS_MID(
  >                     partition "SYS_P00077"
  >                     )
  >                     with limit of ('00400')
  >                 otherwise in EMPIDS_OVER(
  >                     partition "SYS_P00078"
  >                     );
  >     commit work;
  >     $SQL$
  >     SQL> ATTACH FILENAME MF_PERSONNEL.RDB;
  >     SQL> ALTER INDEX EMPLOYEES_HASH
  >     cont> RENAME PARTITION SYS_P00076 TO IDS_LOW;
  >     SQL> ALTER INDEX EMPLOYEES_HASH
  >     cont> RENAME PARTITION SYS_P00077 TO IDS_MID;
  >     SQL> ALTER INDEX EMPLOYEES_HASH
  >     cont> RENAME PARTITION SYS_P00078 TO IDS_HIGH;
  >     SQL> COMMIT;
  >     SQL> SHOW INDEX EMPLOYEES_HASH;
  >     Indexes on table EMPLOYEES:
  >     EMPLOYEES_HASH                  with column EMPLOYEE_ID
  >       No Duplicates allowed
  >       Type is Hashed Scattered
  >       Key Suffix Compression is DISABLED
  >     Store clause:           STORE USING (EMPLOYEE_ID)
  >                                  IN EMPIDS_LOW WITH LIMIT OF ('00200')
  >                                  IN EMPIDS_MID WITH LIMIT OF ('00400')
  >                                  OTHERWISE IN EMPIDS_OVER
  >                             Rename PARTITION SYS_P00076 TO IDS_LOW
  >                             Rename PARTITION SYS_P00077 TO IDS_MID
  >                             Rename PARTITION SYS_P00078 TO IDS_HIGH

  > 例5: 多数の記憶域にパーティション化された大規模な索引の作成

  > まず、次のようにデータベース定義を作成します。

  >     SQL> CREATE INDEX ... MAINTENANCE IS ENABLED DEFERRED ...;

  > 次に、各パーティションをパラレル実行で構築するバッチ・ジョブをサブミットします。たとえば、バッチ・ジョブごとに次のようなスクリプトを実行します。

  >     ATTACH 'filename testdatabase';
  >     SET FLAGS 'index_stats';
  >     ALTER INDEX TRANSACTIONS_INDEX BUILD PARTITION PART_1;
  >     COMMIT;

  > 最後に、バッチ・ジョブの完了後、データベース管理者はメンテナンス・モードをENABLED IMMEDIATEに変更して、索引を問合せの使用に対してアクティブにする必要があります。ある手順が失敗した場合（考えられる理由は、リソースの制限や失敗したノード）、BUILD ALL PARTITIONS句を追加できます。

  >     SQL> SET FLAGS 'index_stats';
  >     SQL> SET TRANSLATION READ WRITE RESERVING...FOR EXCLUSIVE WRITES;
  >     SQL> ALTER INDEX ... BUILD ALL PARTITIONS;
  >     SQL> ALTER INDEX ... MAINTENANCE IS ENABLED IMMEDIATE;
  >     SQL> COMMIT;

  > この体系は、CREATE INDEX文を直接発行することと比較して、いくつか利点があります。

  > - 作成処理はパラレル実行でき、それによりリソースの使用率が向上し（読取りおよびソート対象の行数が減少する）、索引作成にかかる実行時間を短縮できます。

  > - 処理されるパーティションは、全索引と比較すると小さいため、処理されるデータの量もより少なくなります。これにより、これらのトランザクションに関わる.rujファイルが小さくなり、AIJファイル領域も少なくなります。

  > - パーティションの構築はそれぞれ別個のトランザクション内で実行され、失敗した手順がある場合に簡単に繰り返すことができるため、CREATE INDEX文全体を繰り返す必要がありません。

  > - 失敗した手順がある場合、スクリプトに含まれるBUILD ALL PARTITIONS句によってもそれらの手順が繰り返されます。

  > 例6: 多数の記憶域にパーティション化された大規模な索引の削除

  > まず、次のように索引を無効にします。

  >     SQL> ALTER INDEX TRANSACTIONS_INDEX MAINTENANCE IS DISABLED;

  > 次に、パーティションをパラレル実行で切り捨てるバッチ・ジョブをサブミットします。

  >     SQL> ALTER INDEX TRANSACTIONS_INDEX TRUNCATE PARTITION PART_1;
  >     SQL> COMMIT;

  > 最後に、バッチ・ジョブが完了した後、メタデータを削除します。

  >     SQL> DROP INDEX TRANSACTIONS_INDEX;

  > この体系は、DROP INDEX文を直接発行することと比較して、いくつか利点があります。

  > - 切捨て処理はパラレル実行でき、それによりリソースの使用率が向上し、索引削除にかかる実行時間を短縮できます。

  > - 処理されるパーティションは、全索引と比較すると小さいため、処理されるデータの量もより少なくなります。これにより、これらのトランザクションに関わる.rujファイルが小さくなり、AIJファイル領域も少なくなります。

  > - パーティションの切捨てはそれぞれ別個のトランザクション内で実行され、失敗した手順がある場合に簡単に繰り返すことができるため、処理全体を繰り返す必要がありません。

  > - 失敗した手順がある場合、DROP INDEX文によってもそれらの手順が繰り返されます。

  > 例7: TRUNCATE PARTITION文の使用

  > 次の例は、MF_PERSONNELデータベースに対してTRUNCATE PARTITION文を使用する方法を示しています。

  >     SQL> show index (partition) EMPLOYEES_HASH
  >     Indexes on table EMPLOYEES:
  >     EMPLOYEES_HASH                  with column EMPLOYEE_ID
  >       No Duplicates allowed
  >       Type is Hashed Scattered
  >       Key suffix compression is DISABLED

  >      Partition information for index:
  >       Partition: (1) SYS_P00076
  >        Storage Area: EMPIDS_LOW
  >       Partition: (2) SYS_P00077
  >        Storage Area: EMPIDS_MID
  >       Partition: (3) SYS_P00078
  >        Storage Area: EMPIDS_OVER

  >     SQL> alter index employees_hash truncate partition SYS_P00077;
  >     %RDB-W-META_WARN, metadata successfully updated with the reported warning
  >     -RDMS-W-IDXBLDPEND, index in build pending state - maintenance is disabled
  >     SQL> insert into employees default values;
  >     %RDB-E-READ_ONLY_REL, relation EMPLOYEES was reserved for read access; updates
  >     not allowed
  >     -RDMS-F-BUILDPENDING, index in build pending state - operation not permitted

  > 索引の作成が完了するまで、問合せオプティマイザはそれを使用できず、索引の定義対象である表の更新も実行できません。SHOW INDEXコマンドは、この状態についてレポートします。

  >     SQL> show index employees_hash
  >     Indexes on table EMPLOYEES:
  >     EMPLOYEES_HASH                  with column EMPLOYEE_ID
  >       No Duplicates allowed
  >       Type is Hashed Scattered
  >       Key suffix compression is DISABLED
  >       Maintenance is Deferred - build pending

  # ALTER MODULE文

  > モジュールを変更してルーチンを追加または削除したり、コメントを変更したり、ストアド・ルーチンをコンパイルします。

  ## 環境

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

  > - 対話型SQL内

  > - ホスト言語プログラムに埋め込まれる場合

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

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

  ## 形式

  ## 引数

  > ### ADD routine-clause

  > 新規のファンクションおよびプロシージャをモジュールに追加できます。routine-clauseの詳細は、「CREATE MODULE文」を参照してください。ALTER MODULE句を終了し、文を明白に終了するには、END MODULE句を使用する必要があります。

  > ### COMMENT IS 'string'

  > モジュールに関するコメントを追加します。コメントは一重引用符（'）で囲み、コメント内の複数の行はスラッシュ（/）で区切ります。この句は、COMMENT ON MODULE文と同義です。

  > ### COMPILE

  > モジュール内のストアド・ルーチンを再コンパイルします。コンパイルが成功すると、無効とマークされていたルーチンでは、このフラグがクリアされます。

  > ### drop-routine-clause

  > DROP FUNCTION句およびDROP PROCEDURE句は、このモジュールから名前付きルーチンを削除します。All DROP句は、このALTER文の中のCOMPILE句およびADD句の前に実行します。

  > ### END MODULE

  > 複合文の終わりとALTER MODULE文の終わりを区別する方法がないため、ADD FUNCTIONまたはADD PROCEDUREを使用する場合は、この終了句が必要です。

  > ### RENAME TO

  > 変更中のモジュール名を変更します。詳細は、「RENAME文」を参照してください。新規名がシノニム名である場合は、エラーが発生します。

  > RENAME TO句には、このデータベースに対して有効なシノニムが必要です。「ALTER DATABASE文」のSYNONYMS ARE ENABLED句に関する説明を参照してください。これらのシノニムがデータベース定義またはアプリケーションによって使用されていない場合は、削除される可能性があります。

  > このモジュールの新規名には、古い名前を使用してシノニムが作成されます。この名前がアプリケーションによって使用されなくなった場合は、このシノニムは削除できます。

  ## 使用方法

  > - 被参照モジュールに対するALTER権限が必要です。

  > - ALTER MODULE文によって、名前付きモジュール用のRDB$MODULES表のRDB$LAST_ALTERED列がトランザクションのタイムスタンプで更新されます。

  ## 例

  > 例1: モジュールに関するコメントの変更

  > この例で示すように、モジュールに関するコメントは、COMMENT IS句を使用して追加および変更できます。

  >     SQL> alter module EMPLOYEES_MAINTENANCE
  >     cont>     comment is
  >     cont>           'routines to add and remove employee rows'
  >     cont>     /     'Fix: also record the employees birthday';
  >     SQL>
  >     SQL> show module EMPLOYEES_MAINTENANCE;
  >     Information for module EMPLOYEES_MAINTENANCE

  >      Header:
  >      EMPLOYEES_MAINTENANCE
  >      Comment:       routines to add and remove employee rows
  >                     Fix: also record the employees birthday
  >      Module ID is: 7

  >      Routines in module EMPLOYEES_MAINTENANCE:
  >          ADD_EMPLOYEE
  >          IS_CURRENT_EMPLOYEE
  >          REMOVE_EMPLOYEE

  > 例2: モジュール内のすべてのルーチンの再検証

  > COMPILE句を使用して、各ストアド・プロシージャまたはファンクションが実行可能かどうかをチェックできます。コンパイルが失敗すると、第1の理由がレポートされます。この例では、欠落している表が理由です。

  >     SQL> alter module EMPLOYEES_MAINTENANCE compile;
  >     %RDB-E-NO_META_UPDATE, metadata update failed
  >     -RDB-E-OBSOLETE_METADA, request references metadata objects that no longer exist
  >     -RDMS-F-BAD_SYM, unknown relation symbol - ARCHIVE_EMPLOYEES

  > 例3: モジュール内のルーチンの置換

  > 次の例では、簡単なモジュールを作成し、DROP TABLE...CASCADEの効果を示します。つまり、プロシージャREMOVE_EMPLOYEEが無効であるとマークされます。COMPILE句を使用してプロシージャを再検証しようとしますが、被参照表が存在していません。表の置換後、COMPILEは正常に完了します。

  >     SQL> set dialect 'sql99';
  >     SQL> attach 'file PERSONNEL1';
  >     SQL>
  >     SQL> create table EMPLOYEES
  >     cont>     (employee_id        integer,
  >     cont>      last_name          char(40),
  >     cont>      first_name         char(40),
  >     cont>      birthday           date,
  >     cont>      start_date         date default current_date);
  >     SQL>
  >     SQL> create table ARCHIVE_EMPLOYEES
  >     cont>     (employee_id        integer,
  >     cont>      last_name          char(40),
  >     cont>      first_name         char(40),
  >     cont>      archive_date       date default current_date);
  >     SQL>
  >     SQL> create module EMPLOYEES_MAINTENANCE
  >     cont>
  >     cont>     procedure REMOVE_EMPLOYEE (in :employee_id integer);
  >     cont>     begin
  >     cont>     -- take copy of the old row
  >     cont>     insert into ARCHIVE_EMPLOYEES
  >     cont>         (employee_id, last_name, first_name)
  >     cont>         select employee_id, last_name, first_name
  >     cont>         from EMPLOYEES
  >     cont>         where employee_id = :employee_id;
  >     cont>     -- remove the old row
  >     cont>     delete from EMPLOYEES
  >     cont>         where employee_id = :employee_id;
  >     cont>     end;
  >     cont>
  >     cont>     procedure ADD_EMPLOYEE
  >     cont>         (in :employee_id integer,
  >     cont>          in :last_name char(40),
  >     cont>          in :first_name char(40),
  >     cont>          in :birthday date);
  >     cont>     insert into EMPLOYEES
  >     cont>         (employee_id, last_name, first_name, birthday)
  >     cont>         values (:employee_id, :last_name, :first_name, :birthday);
  >     cont>
  >     cont> end module;
  >     SQL>
  >     SQL> show module EMPLOYEES_MAINTENANCE
  >     Information for module EMPLOYEES_MAINTENANCE

  >      Header:
  >      EMPLOYEES_MAINTENANCE
  >      Module ID is: 7

  >      Routines in module EMPLOYEES_MAINTENANCE:
  >          ADD_EMPLOYEE
  >          REMOVE_EMPLOYEE

  >     SQL>
  >     SQL> drop table ARCHIVE_EMPLOYEES cascade;
  >     SQL>
  >     SQL> show procedure REMOVE_EMPLOYEE;
  >     Information for procedure REMOVE_EMPLOYEE

  >     Current state is INVALID
  >             Can be revalidated
  >      Procedure ID is: 8
  >      Source:
  >      REMOVE_EMPLOYEE (in :employee_id integer);
  >         begin
  >         -- take copy of the old row
  >         insert into ARCHIVE_EMPLOYEES
  >             (employee_id, last_name, first_name)
  >             select employee_id, last_name, first_name
  >             from EMPLOYEES
  >             where employee_id = :employee_id;
  >         -- remove the old row
  >         delete from EMPLOYEES
  >             where employee_id = :employee_id;
  >         end
  >      No description found
  >      Module name is: EMPLOYEES_MAINTENANCE
  >      Module ID is: 7
  >      Number of parameters is: 1

  >     Parameter Name                  Data Type        Domain or Type
  >     --------------                  ---------        --------------
  >     EMPLOYEE_ID                     INTEGER
  >             Parameter position is 1
  >             Parameter is IN (read)
  >             Parameter is passed by reference

  >     SQL>
  >     SQL> -- COMPILE reports the missing table
  >     SQL> alter module EMPLOYEES_MAINTENANCE compile;
  >     %RDB-E-NO_META_UPDATE, metadata update failed
  >     -RDB-E-OBSOLETE_METADA, request references metadata objects that no longer exist
  >     -RDMS-F-BAD_SYM, unknown relation symbol - ARCHIVE_EMPLOYEES
  >     SQL>
  >     SQL> create table ARCHIVE_EMPLOYEES
  >     cont>     (employee_id        integer,
  >     cont>      last_name          char(40),
  >     cont>      first_name         char(40),
  >     cont>      birthday           date,
  >     cont>      archive_date       date default current_date);
  >     SQL>
  >     SQL> -- new table definition is compatible
  >     SQL> alter module EMPLOYEES_MAINTENANCE compile;
  >     SQL>
  >     SQL> alter module EMPLOYEES_MAINTENANCE
  >     cont>     comment is
  >     cont>           'routines to add and remove employee rows'
  >     cont>     /     'Fix: also record the employees birthday'
  >     cont>
  >     cont>     drop procedure REMOVE_EMPLOYEE if exists
  >     cont>
  >     cont>     add procedure REMOVE_EMPLOYEE (in :employee_id integer);
  >     cont>     begin
  >     cont>     -- take copy of the old row
  >     cont>     insert into ARCHIVE_EMPLOYEES
  >     cont>         (employee_id, last_name, first_name, birthday)
  >     cont>         select employee_id, last_name, first_name, birthday
  >     cont>         from EMPLOYEES
  >     cont>         where employee_id = :employee_id;
  >     cont>     -- remove the old row
  >     cont>     delete from EMPLOYEES
  >     cont>         where employee_id = :employee_id;
  >     cont>     end;
  >     cont> end module;
  >     SQL>
  >     SQL> show module EMPLOYEES_MAINTENANCE;
  >     Information for module EMPLOYEES_MAINTENANCE

  >      Header:
  >      EMPLOYEES_MAINTENANCE
  >      Comment:       routines to add and remove employee rows
  >                     Fix: also record the employees birthday
  >      Module ID is: 7

  >      Routines in module EMPLOYEES_MAINTENANCE:
  >          ADD_EMPLOYEE
  >          REMOVE_EMPLOYEE

  > 例4: モジュールへの新規のファンクションの追加

  > 次の例では、ADD句を使用して既存のモジュールに新規のファンクションを追加しています。

  >     SQL> alter module EMPLOYEES_MAINTENANCE
  >     cont>     add function IS_CURRENT_EMPLOYEE (in :employee_id integer)
  >     cont>         returns integer;
  >     cont>     return (case
  >     cont>             when exists (select *
  >     cont>                          from EMPLOYEES
  >     cont>                          where employee_id = :employee_id)
  >     cont>             then 1
  >     cont>             else 0
  >     cont>             end);
  >     cont> end module;
  >     SQL>
  >     SQL> show module EMPLOYEES_MAINTENANCE;
  >     Information for module EMPLOYEES_MAINTENANCE

  >      Header:
  >      EMPLOYEES_MAINTENANCE
  >      Comment:       routines to add and remove employee rows
  >                     Fix: also record the employees birthday
  >      Module ID is: 7

  >      Routines in module EMPLOYEES_MAINTENANCE:
  >          ADD_EMPLOYEE
  >          IS_CURRENT_EMPLOYEE
  >          REMOVE_EMPLOYEE

  # ALTER OUTLINE文

  > アウトライン定義を変更します。

  ## 環境

  > ALTER OUTLINE文は次の環境で使用できます。

  > - 対話型SQL内

  > - ホスト言語プログラムに埋め込まれる場合

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

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

  ## 形式

  ## 引数

  > ### COMMENT IS string

  > COMMENT IS句を使用して、問合せアウトラインとともに格納されているコメントを変更できます。COMMENT ON文は、ALTER OUTLINE...COMMENT IS句と同じ機能があります。

  > この句は、COMMENT ONプロシージャと同義です。

  > ### COMPILE

  > COMPILEオプションは、DROP TABLEまたはDROP INDEXによって無効にされた問合せアウトラインに適用できます。表および索引が再作成された場合、問合せアウトラインは再有効化されます。たとえば、再有効化されると、オプティマイザがこの問合せアウトラインの使用を試みます。

  > 注意 有効とマークされた問合せアウトラインが、索引定義が変更されているために使用されない可能性があります。問合せアウトラインとともに格納された情報が少なすぎるため、完全な整合性チェックを実行できません。可能であれば、このアウトラインを使用する問合せを実行して、正しい索引および表の使用方法を検証する必要があります。

  > 問合せアウトラインが現在有効な場合、この句はOracle Rdbによって無視されます。

  > ### MOVE TO

  > MOVE TOは、マルチスキーマ・データベースに対してのみ有効です。MULTISCHEMA IS ON句によって明示的または暗黙的にアタッチされる必要があります。MOVE TO句を使用して、問合せアウトラインを他のカタログやスキーマに移動できます。この句がマルチスキーマ環境以外で指定されると、エラーが発生します。

  > ターゲットのカタログおよびスキーマは、このデータベース内に存在する必要があります。

  > ### RENAME TO

  > RENAME TO句を使用して、アウトライン名を変更できます。新規名は、データベースにすでに存在するもの以外にする必要があります。

  > RENAME TOが、MULTISCHEMA IS ONを使用してアタッチされ、マルチスキーマ・データベース内で使用されている場合、マルチスキーマ名のみが変更され、オブジェクトのSTORED NAMEは変更されません。問合せアウトラインのSTORED NAMEを変更するには、MULTISCHEMA IS OFF句を使用して明示的にデータベースにアタッチする必要があります（次の例を参照）。Oracle Rdbによって問合せアウトラインのSTORED NAMEが生成されている場合があります。

  > 注意 この新規アウトライン名を参照するには、OPTIMIZE USING句を使用するすべての問合せも変更する必要があります。

  ## 使用方法

  > - この文を実行するには、データベースに対するALTER権限が必要です。

  > - アウトライン名には、接頭辞としてデータベースの別名を付けることができます。次に例を示します。

  >       SQL> attach 'ALIAS db1 FILENAME mschema_db';
  >       SQL> alter outline db1.SHOW_TABLES_QUERY
  >       cont>     comment is 'used to select SHOW_TAB_INDEX_01';

  >   マルチスキーマ・データベースでは、名前にスキーマ名とカタログ名を含めることもできます。

  ## 例

  > 例1: 問合せアウトラインに関するコメントの変更

  >     SQL> alter outline show_tables
  >     cont>     comment is  'show the tables query'
  >     cont>     /           'derived from a stored procedure';
  >     SQL> show outline show_tables
  >          SHOW_TABLES
  >      Comment:       show the tables query
  >                     derived from a stored procedure
  >      Source:
  >     -- Rdb Generated Outline :  8-FEB-2002 16:17
  >     create outline SHOW_TABLES
  >     id '4D5B5CC5B46C6DD21B0E1999C0EB8BF3'
  >     mode 0
  >     as (
  >       query (
  >     -- For loop
  >         subquery (
  >           RDB$RELATIONS 0         access path index       RDB$REL_REL_NAME_NDX
  >           )
  >         )
  >       )
  >     compliance optional     ;

  > 例2: alternate COMMENT ON構文を使用したコメントの変更

  >     SQL> comment on outline show_tables
  >     cont>     is  'show the tables query'
  >     cont>     /   'derived from the stored procedure'
  >     cont>     /   'SHOW_TABLES';

  > 例3: 問合せアウトラインの名前の変更

  >     SQL> alter outline show_tables
  >     cont>     rename to show_the_tables;
  >     SQL> show outline show_the_tables
  >          SHOW_THE_TABLES
  >      Comment:       show the tables query
  >                     derived from the stored procedure
  >                     testing new COMMENT ON OUTLINE
  >      Source:
  >     -- Rdb Generated Outline :  8-FEB-2002 16:17
  >     create outline SHOW_THE_TABLES
  >     id '4D5B5CC5B46C6DD21B0E1999C0EB8BF3'
  >     mode 0
  >     as (
  >       query (
  >     -- For loop
  >         subquery (
  >           RDB$RELATIONS 0         access path index       RDB$REL_REL_NAME_NDX
  >           )
  >         )
  >       )
  >     compliance optional     ;

  > 例4: DROP INDEX後に有効な問合せアウトラインの設定

  > まず、定義されたSTRATEGYフラグを使用してストアド・プロシージャが実行され、MY_OUTLINEという名前の問合せアウトラインが使用されていることが表示されます。

  >     SQL> set flags 'strategy';
  >     SQL> call my_procedure();
  >     ~S: Outline "MY_OUTLINE" used
  >     Aggregate       Conjunct        Index only retrieval of relation MY_TABLE
  >       Index name  MY_INDEX [1:1]

  > 次に、問合せが使用した（問合せアウトラインによって参照された）索引が削除されます。これにより、問合せアウトラインが無効に設定されます（WARN_INVALIDフラグを使用して表示される）。これで、ストアド・プロシージャを実行すると、問合せにより順次アクセス計画が使用されるようになりました。

  >     SQL> set flags 'warn_invalid';
  >     SQL> drop index my_index;
  >     ~Xw: Outline "MY_OUTLINE" marked invalid (index "MY_INDEX" dropped)
  >     SQL>
  >     SQL> set flags 'strategy';
  >     SQL> call my_procedure();
  >     ~S: Outline "MY_OUTLINE" is invalid and can not be used
  >     Aggregate       Conjunct        Get
  >     Retrieval sequentially of relation MY_TABLE
  >     SQL> show outline my_outline
  >          MY_OUTLINE
  >         Outline has been marked invalid
  >        .
  >        .
  >        .

  > ALTER OUTLINE ...COMPILE句は、アウトラインを有効にするために使用されます。最初の試行により、索引が欠落していることがレポートされます。索引が再作成されると、COMPILEが成功します。これで、ストアド・プロシージャをコールすると、この問合せアウトラインが使用されるようになりました。

  >     SQL> alter outline my_outline compile;
  >     %RDB-E-NO_META_UPDATE, metadata update failed
  >     -RDMS-F-INDNOTEXI, index MY_INDEX does not exist in this database
  >     SQL> -- must redefine the index
  >     SQL> create index my_index on my_table (b desc);
  >     SQL> alter outline my_outline compile;
  >     SQL> call my_procedure();
  >     ~S: Outline "MY_OUTLINE" used
  >     Aggregate       Conjunct        Index only retrieval of relation MY_TABLE
  >       Index name  MY_INDEX [1:1]
  >     SQL>