Postgres Plus Advanced Server Oracle Compatibility Developer's Guide : 3.3 SQLコマンド

Previous PageTable Of ContentsNext Page

3.3 SQLコマンド

この章では、Postgres PlusでサポートされるOracle互換のSQLコマンドを説明します。この章のSQLコマンドはOracleデータベースでもPostgres Plusデータベースでも機能します。

以下の点に注意してください。

    n Postgres Plusでは、ここで説明するコマンド以外のコマンドもサポートします。それらのコマンドはOracle互換ではありません。または、OracleのSQLコマンドと同様もしくは同じ機能を提供しますが、構文が異なります。

    n この章では、SQLコマンドが利用できるすべての構文、オプション、機能を必ずしも説明していません。Oracle互換ではない構文、オプション、機能はコマンドの説明から省略しています。

    n Postgres Plus Advanced Server documentation」では、Oracle互換ではないコマンドの仕様も説明してます。

3.3.1 ALTER INDEX

名前

ALTER INDEX -- インデックス定義を変更する

概要

ALTER INDEX name RENAME TO new_name

説明

ALTER INDEXは既存のインデックスの定義を変更します。RENAME構文は、インデックスの名前を変更します。格納されたデータには影響しません。

パラメータ

name

      変更対象の既存のインデックスの名前です(スキーマ修飾名も可)。

new_name

      インデックスの新しい名前です。

既存のインデックスの名前を変更します。

    ALTER INDEX name_idx RENAME TO empname_idx;

    関連項目

    CREATE INDEX, DROP INDEX

    3.3.2 ALTER ROLE

    名前

    ALTER ROLE -- データベースロールを変更する

    概要

    ALTER ROLE name IDENTIFIED BY password

    説明

    ALTER ROLEはロールのパスワードを変更します。スーパーユーザかCREATEROLE権限を持つユーザがこのコマンドを使用することができます。変更対象のロールがSUPERUSER属性を持つ場合、このコマンドを使用できるのはスーパーユーザのみです。ロールがLOGIN属性を持たない場合、パスワードは意味がありません。

    パラメータ

    name

        パスワードを変更するロールの名前です。

    password

        ロールの新しいパスワードです。

    注釈

    メンバ資格の変更にはGRANTおよびREVOKEを使用してください。

    ロールのパスワードを変更します。

      ALTER ROLE admins IDENTIFIED BY xyRP35z;

      関連項目

      CREATE ROLE, DROP ROLE, GRANT, REVOKE, SET ROLE

      3.3.3 ALTER SEQUENCE

      名前

      ALTER SEQUENCE  --  シーケンスジェネレータの定義を変更する

      概要

      ALTER SEQUENCE name [ INCREMENT BY increment ]
        [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
        [ CACHE cache | NOCACHE ] [ CYCLE ]

      説明

      ALTER SEQUENCEは、既存のシーケンスジェネレータのパラメータを変更します。ALTER SEQUENCEで指定されなかったパラメータについては、以前の設定が保持されます。

      パラメータ

      name

          変更するシーケンスの名前です(スキーマ修飾名も可)。

      increment

          INCREMENT BY increment句は省略可能です。正の値が指定された時は昇順のシーケンス、負の値が指定された時は降順のシーケンスを作成します。指定がない場合、以前の増分値が保持されます。

      minvalue

          MINVALUE minvalueはシーケンスジェネレータが生成する最小値を決定します。指定されていなければ、現在の最小値が保持されます。NO MINVALUEが指定された場合、昇順の時は1、降順の時は-263-1がデフォルトになります。NO MINVALUEキーワードは、Oracleとの互換性はありません。

      maxvalue

          MAXVALUE maxvalueはシーケンスジェネレータが生成する最大値を決定します。指定されていなければ、現在の最大値が保持されます。NO MAXVALUEが指定された場合、昇順の時は263-1、降順の時は-1がデフォルトになります。NO MAXVALUE キーワードは、Oracleとの互換性はありません。

      cache

          CACHE cache句を使用すると、アクセスを高速化するために、シーケンス番号を事前に割り当て、メモリに保存しておくことができます。最小値は1です(一度に生成する値が1つだけなので、キャッシュがない状態になります)。指定がなければ、以前のキャッシュ値が保持されます。

      CYCLE

          CYCLEキーワードを使用すると、シーケンスが限界値(昇順の場合はmaxvalue、降順の場合はminvalue)に達した時、そのシーケンスを周回させることができます。限界値に達した時、次に生成される番号は、昇順の場合はminvalue、降順の場合はmaxvalueになります。指定がなければ、以前の設定が保持されます。NO CYCLEキーワードが指定されると、シーケンスの限界値に達した後に周回されません。NO CYCLEキーワードは、Oracleとの互換性はありません。

      注釈

      同じシーケンスから番号を取得するトランザクションの同時実行ブロックを防ぐために、シーケンス生成パラメータに関するALTER SEQUENCEの操作はロールバックできません。ALTER SEQUENCEによる変更は即座に反映され、元に戻すことはできません。

      ALTER SEQUENCEは、コマンドを実行したバックエンド以外のバックエンドにおけるNEXTVALに対しては、すぐには効力を発揮しません。これらのバックエンドは事前に割り当てられた(キャッシュされた)値を持っており、この値を全て使い果たした後に、変更されたシーケンス生成パラメータを検知します。コマンドを実行したバックエンドには、即座に変更が反映されます。

      serialシーケンスの増分値とキャッシュ値を変更します。

        ALTER SEQUENCE serial INCREMENT BY 2 CACHE 5;

        関連項目

        CREATE SEQUENCE, DROP SEQUENCE

        3.3.4 ALTER SESSION

        名前

        ALTER SESSION -- ランタイムパラメータを変更する

        概要

        ALTER SESSION SET name = value

        説明

        ALTER SESSIONコマンドは、ランタイムコンフィグレーションパラメータを変更します。ALTER SESSIONは、現在のセッションで使用されている値にのみ影響します。これらのパラメータのいくつかはOracle互換のためだけに使用され、Postgres Plusのランタイムには何ら影響を与えません。その他のパラメータは、Postgres Plusデータベースの対応するランタイムコンフィグレーションパラメータを変更します。

        パラメータ

        name

            ランタイムパラメータの名前です。利用可能なパラメータは以下の通りです。

        value

            パラメータに設定する値です。

        コンフィグレーションパラメータ

        ALTER SESSIONで以下のパラメータを変更できます。

        NLS_DATE_FORMAT (string)

            日付書式を設定します。これは、曖昧な日付入力に対しての変換規則にもなります。datestyleパラメータも同様です。

        NLS_LANGUAGE (string)

            表示されるメッセージの言語を設定します。lc_messagesパラメータも同様です。

        NLS_LENGTH_SEMANTICS (string)

            BYTEもしくはCHARのどちらかを指定できます。デフォルトは、BYTEです。このパラメータはOracle互換のためだけに提供されており、Postgres Plusには何ら影響を与えません。

        OPTIMIZER_MODE (string)

            問い合わせ時のデフォルトのオプティマイザ・モードを設定します。ALL_ROWSCHOOSEFIRST_ROWSFIRST_ROWS_10FIRST_ROWS_100FIRST_ROWS_1000が指定できます。デフォルトは、CHOOSEです。詳細は、第3.4章を参照してください。

        QUERY_REWRITE_ENABLED (string)

            TRUEFALSEFORCEが指定できます。デフォルトは、FALSEです。このパラメータはOracle互換のためだけに提供されており、Postgres Plusには何ら影響を与えません。

        QUERY_REWRITE_INTEGRITY (string)

            ENFORCEDTRUSTEDSTALE_TOLERATEDが指定できます。デフォルトは、ENFORCEDです。このパラメータはOracle互換のためだけに提供されており、Postgres Plusには何ら影響を与えません。

        UTF-8エンコーディングの英語(U.S.)に言語を設定します。この例にあるen_US.UTF-8という値はPostgres Plusでの形式です。この形式はOracle互換ではありませんので、注意してください。

          ALTER SESSION SET NLS_LANGUAGE = 'en_US.UTF-8';

          日付書式を設定します。

            ALTER SESSION SET NLS_DATE_FORMAT = 'dd/mm/yyyy';

            3.3.5 ALTER TABLE

            名前

            ALTER TABLE -- テーブル定義を変更する

            概要

            ALTER TABLE name
              action [, ...]
            ALTER TABLE name
              RENAME COLUMN column TO new_column
            ALTER TABLE name
              RENAME TO new_name

            ここで、actionは以下のいずれかです。

              ADD column type [ column_constraint [ ... ] ]
              DROP COLUMN column
              ADD table_constraint
              DROP CONSTRAINT constraint_name [ CASCADE ]

            説明

            ALTER TABLEは既存のテーブルの定義を変更します。このコマンドには、次のような副構文があります。

            ADD column type

                この構文を使用すると、CREATE TABLEと同じ構文を使って新しい列をテーブルに追加できます。

            DROP COLUMN

                この構文を使用すると、テーブルから列を削除できます。 削除する列を含んでいるインデックスおよびテーブル制約も自動的に削除されます。

            ADD table_constraint

                この構文を使用すると、CREATE TABLEと同じ構文を使って新しい制約をテーブルに追加できます。

            DROP CONSTRAINT

                この構文を使用すると、テーブル上の指定した制約を削除できます。現在、テーブル上の制約は一意的な名前である必要がありません。したがって、指定した名前に複数の制約が一致することがあります。その場合、一致したすべての制約が削除されます。

            RENAME

                RENAME構文を使用すると、テーブル(もしくは、インデックス、シーケンス、ビュー)の名前や、テーブルの個々の列名を変更できます。 格納されているデータへの影響はありません。

            ALTER TABLEコマンドを使用するには、変更するテーブルを所有している必要があります。

            パラメータ

            name

                変更対象となる既存のテーブルの名前です(スキーマ修飾名も可)。

            column

                新規または既存の列の名前です。

            new_column

                既存の列の新しい名前です。

            new_name

                テーブルの新しい名前です。

            type

                新しい列のデータ型です。

            table_constraint

                テーブルの新しいテーブル制約です。

            constraint_name

                削除する既存の制約の名前です。

            CASCADE

                削除された制約に依存しているオブジェクトを、自動的に削除します。

            注釈

            ADD COLUMNによって列を追加した時、テーブル内の既存行に追加された列は、全てデフォルト値(DEFAULTが指定されていない場合はnull)で初期化されます。

            nullではないデフォルト値を持つ列を追加するには、テーブル全体の書き換えが必要になります。テーブルが巨大な場合、この処理に非常に時間がかかる可能性があります。また、一時的に2倍のディスク容量が必要とされます。

            CHECKあるいはNOT NULL制約を追加する時は、既存の行が制約に従うかどうかを検証するためにテーブルの走査が必要になります。

            DROP COLUMN構文は、列を物理的には削除せず、SQLを操作する上で不可視にします。このコマンドを実行した後、テーブルに挿入または更新が行われると、削除した列にはnullが格納されます。したがって、列の削除は短時間で行えます。しかし、削除された列が占めていた領域がまだ回収されていないため、テーブルのディスク上のサイズはすぐには小さくなりません。この領域は、その後既存の行が更新されるタイミングで回収されます。

            システムカタログテーブルについては、いかなる部分の変更も許可されていません。

            有効なパラメータの詳しい説明はCREATE TABLEを参照してください。

            VARCHAR2型の列をテーブルに追加します。

              ALTER TABLE emp ADD address VARCHAR2(30);

              テーブルから列を削除します。

                ALTER TABLE emp DROP COLUMN address;

                既存の列の名前を変更します。

                  ALTER TABLE emp RENAME COLUMN address TO city;

                  既存のテーブルの名前を変更します。

                    ALTER TABLE emp RENAME TO employee;

                    テーブルにcheck制約を付与します。

                      ALTER TABLE emp ADD CONSTRAINT sal_chk CHECK (sal > 500);

                      テーブルからcheck制約を削除します。

                        ALTER TABLE emp DROP CONSTRAINT sal_chk;

                        関連項目

                        CREATE TABLE, DROP TABLE

                        3.3.6 ALTER TABLESPACE

                        名前

                        ALTER TABLESPACE -- テーブル空間の定義を変更する

                        概要

                        ALTER TABLESPACE name RENAME TO newname

                        説明

                        ALTER TABLESPACEはテーブル空間の定義を変更します。

                        パラメータ

                        name

                            既存のテーブル空間の名前です。

                        newname

                            新しいテーブル空間の名前です。pg_から始まる名前は、システムのテーブル空間用に予約されているため使用することができません。

                        empspaceテーブル空間をemployee_spaceという名前に変更します。

                          ALTER TABLESPACE empspace RENAME TO employee_space;

                          関連項目

                          DROP TABLESPACE

                          3.3.7 ALTER USER

                          名前

                          ALTER USER -- データベースユーザアカウントを変更する

                          概要

                          ALTER USER name IDENTIFIED BY password

                          説明

                          ALTER USERPostgres Plusユーザアカウントのパスワードを変更します。スーパーユーザかCREATEROLE権限を持つユーザがこのコマンドを使用することができます。一般ユーザも自分自身のパスワードを変更するために、このコマンドを使用することができます。

                          パラメータ

                          name

                              パスワードを変更するユーザの名前です。

                          password

                              このアカウントで使用する新しいパスワードです。

                          ユーザのパスワードを変更します。

                            ALTER USER john IDENTIFIED BY xyz;

                            関連項目

                            CREATE USER, DROP USER

                            3.3.8 COMMENT

                            名前

                            COMMENT -- オブジェクトのコメントを定義する、または変更する

                            概要

                            COMMENT ON
                            {
                              TABLE table_name |
                              COLUMN table_name.column_name
                            } IS 'text'

                            説明

                            COMMENTは、データベースオブジェクトに関するコメントを保存します。コメントを編集するには、同一オブジェクトに対して新しくCOMMENTコマンドを発行してください。各オブジェクトに保存できるコメント文字列は1つだけです。コメントを削除するには、テキスト文字列の部分に空の文字列(スペースなしの連続した2つのシングルクォーテーション)を記述してください。オブジェクトが削除された時、コメントは自動的に削除されます。

                            パラメータ

                            table_name

                                コメントを付加するテーブルの名前です。テーブルの名前は、スキーマ修飾することができます。

                            table_name.column_name

                                コメントを付加するtable_nameテーブルの中の列の名前です。テーブルの名前は、スキーマ修飾することができます。

                            text

                                追加するコメントです。

                            注釈

                            現在、コメントにはセキュリティ機構は存在しません。データベースに接続したユーザは誰でも、そのデータベース内のオブジェクトのコメントを参照することができます(ただし、所有していないオブジェクトに関するコメントを変更できるのはスーパーユーザのみです)。そのため、コメントにはセキュリティ的に重大な情報を記載してはいけません。

                            empテーブルにコメントを付けます。

                              COMMENT ON TABLE emp IS 'Current employee information';

                              empテーブルのempnoにコメントを付けます。

                                COMMENT ON COLUMN emp.empno IS 'Employee identification number';

                                先ほどのコメントを削除します。

                                  COMMENT ON TABLE emp IS '';  
                                  COMMENT ON COLUMN emp.empno IS '';

                                  3.3.9 COMMIT

                                  名前

                                  COMMIT -- 現在のトランザクションをコミットする

                                  概要

                                  COMMIT [ WORK ]

                                  説明

                                  COMMITは現在のトランザクションをコミットします。そのトランザクションで行われた全ての変更が他のユーザから見えるようになり、クラッシュが起きても一貫性が保証されるようになります。

                                  パラメータ

                                  WORK

                                      省略可能なキーワードです。何も効果はありません。

                                  注釈

                                  トランザクションをアボートするにはROLLBACKを使用してください。

                                  トランザクションの外部でCOMMITを発行しても特に問題は発生しません。

                                  SPLプログラムの中ではCOMMITはサポートされていません。

                                  現在のトランザクションをコミットし、全ての変更を永続化します。

                                    COMMIT;	

                                    関連項目

                                    ROLLBACK, ROLLBACK TO SAVEPOINT, SAVEPOINT

                                    3.3.10 CREATE DATABASE

                                    名前

                                    CREATE DATABASE -- 新しいデータベースを作成する

                                    概要

                                    CREATE DATABASE name

                                    説明

                                    CREATE DATABASEは新しいデータベースを作成します。

                                    データベースを作成するには、スーパーユーザ、もしくはCREATEDBという特別な権限を持つユーザである必要があります。通常、データベースの作成者がその新しいデータベースの所有者になります。スーパーユーザではないCREATEDB権限を保持するユーザは、自分自身を所有者とするデータベースのみ作成できます。

                                    新しいデータベースは標準システムデータベースtemplate1を複製することによって作成されます。

                                    パラメータ

                                    name

                                        作成するデータベースの名前です。

                                    注釈

                                    CREATE DATABASEはトランザクションブロックの内側では実行できません。

                                    ほとんどの場合、“could not initialize database directory” という行が含まれるエラーは、データディレクトリの権限不足、ディスク容量不足などファイルシステムについての問題に関連するものです。

                                    新しいデータベースを作成します。

                                      CREATE DATABASE employees;

                                      3.3.11 CREATE DATABASE LINK

                                      名前

                                      CREATE DATABASE LINK -- 新しいデータベースリンクを作成する

                                      概要

                                      CREATE [ PUBLIC ] DATABASE LINK name
                                        CONNECT TO username IDENTIFIED BY ‘password’
                                        USING { libpq ‘host=hostname port=portnum dbname=database’ |
                                          [ oci ] ‘//hostname/database’ }

                                      説明

                                      CREATE DATABASE LINKは新しいデータベースリンクを作成します。データベースリンクは、DELETEINSERTSELECTUPDATEコマンドでリモートのデータベースのテーブルおよびビューが参照できるオブジェクトです。データベースリンクはSQLコマンドで参照されるテーブルまたはビューの名前の後に@dblinkを追加することで参照できます。dblinkはデータベースリンクの名前です。

                                      データベースリンクにはパブリックとプライベートがあります。パブリック・データベースリンクはすべてのユーザが使用できます。プライベート・データベースリンクは所有者しか使用できません。PUBLICオプションを指定すると、パブリック・データベースリンクを作成します。このオプションを省略すると、プライベート・データベースリンクが作成されます。

                                      CREATE DATABASE LINKコマンド実行時には、データベースリンク名と指定した属性がPostgres Plusのpg_catalog.edb_dblinkというシステムテーブル内に保存されます。データベースリンクを使用する時には、そのデータベースリンクを定義するedb_dblinkエントリーを持つデータベースをローカル・データベースと呼びます。そして、そこで定義された属性を持つ対象のサーバおよびデータベースをリモート・データベースと呼びます。

                                      データベースリンクへの参照を含むSQLコマンドは、ローカル・データベースへの接続時に実行されなければいけません。@dblinkを含むSQLコマンド実行時には、リモート・データベースへの適切な認証と接続が行われ、テーブルおよびビューへアクセスすることができるようになります。

                                      パラメータ

                                      PUBLIC

                                          すべてのユーザが使用可能なパブリック・データベースリンクを作成します。省略した場合は、プライベート・データベースリンクとなり、所有者しか使用できません。

                                      name

                                          作成するデータベースリンクの名前です。

                                      username

                                          リモート・データベースへ接続する時のユーザ名です。

                                      password

                                          usernameのパスワードです。

                                      libpq

                                          リモートのPostgres Plusデータベースへの接続を指定します。

                                      oci

                                          リモートのOracleデータベースへの接続を指定します。パラメータが省略された場合、こちらがデフォルトです。

                                      hostname

                                          リモート・データベースサーバの名前もしくはIPアドレスです。

                                      portnum

                                          リモート・データベースサーバへ接続可能なポート番号です。

                                      database

                                          リモート・データベースの名前です。

                                      注釈

                                      リモートのOracleデータベースへのデータベースリンクを参照するSQLコマンドが実行される場合、Postgres Plusデータベースサーバが起動するまで、環境変数ORACLE_HOMEOracleのインストールされたホームディレクトリへ設定されている必要があります。

                                      以下の例では次のように仮定します。Postgres PlusサンプルアプリケーションのempテーブルのコピーをOracleデータベースに作成。Postgres Plusデータベースクラスタへはポート番号5443で接続可能。

                                      oralinkという名前のパブリック・データベースリンクを作成します。Oracleデータベースの名前はxeIPアドレスは127.0.0.1です。また、接続するためのユーザ名はedbパスワードはpasswordです。

                                        CREATE PUBLIC DATABASE LINK oralink CONNECT TO edb IDENTIFIED BY 'password' USING '//127.0.0.1/xe';

                                        oralinkデータベースリンクを使用して、Oracleデータベース内のempテーブル上でSELECTコマンドを実行します。

                                          SELECT * FROM emp@oralink;
                                            
                                          empno | ename  |    job    | mgr  |      hiredate      | sal  | comm | deptno  
                                          -------+--------+-----------+------+--------------------+------+------+--------  
                                            7369 | SMITH  | CLERK     | 7902 | 17-DEC-80 00:00:00 |  800 |      |     20  
                                            7499 | ALLEN  | SALESMAN  | 7698 | 20-FEB-81 00:00:00 | 1600 |  300 |     30  
                                            7521 | WARD   | SALESMAN  | 7698 | 22-FEB-81 00:00:00 | 1250 |  500 |     30  
                                            7566 | JONES  | MANAGER   | 7839 | 02-APR-81 00:00:00 | 2975 |      |     20  
                                            7654 | MARTIN | SALESMAN  | 7698 | 28-SEP-81 00:00:00 | 1250 | 1400 |     30  
                                            7698 | BLAKE  | MANAGER   | 7839 | 01-MAY-81 00:00:00 | 2850 |      |     30  
                                            7782 | CLARK  | MANAGER   | 7839 | 09-JUN-81 00:00:00 | 2450 |      |     10  
                                            7788 | SCOTT  | ANALYST   | 7566 | 19-APR-87 00:00:00 | 3000 |      |     20  
                                            7839 | KING   | PRESIDENT |      | 17-NOV-81 00:00:00 | 5000 |      |     10  
                                            7844 | TURNER | SALESMAN  | 7698 | 08-SEP-81 00:00:00 | 1500 |    0 |     30  
                                            7876 | ADAMS  | CLERK     | 7788 | 23-MAY-87 00:00:00 | 1100 |      |     20  
                                            7900 | JAMES  | CLERK     | 7698 | 03-DEC-81 00:00:00 |  950 |      |     30  
                                            7902 | FORD   | ANALYST   | 7566 | 03-DEC-81 00:00:00 | 3000 |      |     20  
                                            7934 | MILLER | CLERK     | 7782 | 23-JAN-82 00:00:00 | 1300 |      |     10  
                                          (14 行)

                                          edblinkという名前のプライベート・データベースリンクを作成します。Postgres Plusデータベースの名前はedbサーバの名前はlocalhost、接続可能なポート番号は5443です。また、接続するためのユーザ名はPostgres Plus、パスワードはpasswordです。

                                            CREATE DATABASE LINK edblink CONNECT TO Postgres Plus IDENTIFIED BY 'password' USING libpq 'host=localhost port=5443 dbname=edb';

                                            ローカルのedb_dblinkシステムテーブルからoralinkedblinkの属性を表示します。

                                              SELECT lnkname, lnkuser, lnkconnstr FROM pg_catalog.edb_dblink;
                                                
                                               lnkname |   lnkuser    |             lnkconnstr  
                                              ---------+--------------+-------------------------------------  
                                               oralink | edb          | //127.0.0.1/xe  
                                               edblink | Postgres Plus | host=localhost port=5443 dbname=edb  
                                              (2 rows)

                                              OracleデータベースのempテーブルとPostgres Plusデータベースのdeptテーブルを結合します。

                                                SELECT d.deptno, d.dname, e.empno, e.ename, e.job, e.sal, e.comm FROM emp@oralink e, dept@edblink d WHERE e.deptno = d.deptno ORDER BY 1, 3;
                                                  
                                                deptno |   dname    | empno | ename  |    job    | sal  | comm  
                                                --------+------------+-------+--------+-----------+------+------  
                                                     10 | ACCOUNTING |  7782 | CLARK  | MANAGER   | 2450 |  
                                                     10 | ACCOUNTING |  7839 | KING   | PRESIDENT | 5000 |  
                                                     10 | ACCOUNTING |  7934 | MILLER | CLERK     | 1300 |  
                                                     20 | RESEARCH   |  7369 | SMITH  | CLERK     |  800 |  
                                                     20 | RESEARCH   |  7566 | JONES  | MANAGER   | 2975 |  
                                                     20 | RESEARCH   |  7788 | SCOTT  | ANALYST   | 3000 |  
                                                     20 | RESEARCH   |  7876 | ADAMS  | CLERK     | 1100 |  
                                                     20 | RESEARCH   |  7902 | FORD   | ANALYST   | 3000 |  
                                                     30 | SALES      |  7499 | ALLEN  | SALESMAN  | 1600 |  300  
                                                     30 | SALES      |  7521 | WARD   | SALESMAN  | 1250 |  500  
                                                     30 | SALES      |  7654 | MARTIN | SALESMAN  | 1250 | 1400  
                                                     30 | SALES      |  7698 | BLAKE  | MANAGER   | 2850 |  
                                                     30 | SALES      |  7844 | TURNER | SALESMAN  | 1500 |    0  
                                                     30 | SALES      |  7900 | JAMES  | CLERK     |  950 |  
                                                (14 行)

                                                関連項目

                                                DROP DATABASE LINK

                                                3.3.12 CREATE DIRECTORY

                                                名前

                                                CREATE DIRECTORY -- ファイルシステムのディレクトリパスに別名を作成する

                                                概要

                                                CREATE DIRECTORY name AS ‘pathname

                                                説明

                                                CREATE DIRECTORYはファイルシステムのディレクトリパスに別名を作成します。UTL_FILEパッケージプログラムへ適切なパラメータとして別名が指定された時は、オペレーティングシステムのファイルはその別名に対応するディレクトリに作成されるか、もしくはそのディレクトリからアクセスされます。UTL_FILEパッケージの詳細は、第7.4章を参照してください。

                                                パラメータ

                                                name

                                                    ディレクトリパスの別名です。

                                                pathname

                                                    別名に関連付けられるディレクトリの絶対パスです。CREATE DIRECTORYはオペレーティングシステム上のディレクトリを作成する訳ではありません。物理的なディレクトリは、適切なオペレーティングシステムのコマンドを使用して作成しなければいけません。

                                                注釈

                                                UTL_FILEパッケージがディレクトリ内にファイルを作成したり、ディレクトリ内のファイルを読み込むことがある場合、オペレーティングシステムのユーザID、Postgres Plusはそのディレクトリに適切な読み書き権限を持つ必要があります。

                                                ディレクトリパスの別名を削除する場合は、pg_catalog.edb_dirシステムカタログテーブルから直接削除されなければいけません。この操作はスーパーユーザが行う必要があります。edb_dirテーブルはOracle互換ではないことに注意してください。

                                                ディレクトリパスの別名が削除されても、対応するファイルシステムの物理的なディレクトリは削除されません。物理的なディレクトリは、適切なオペレーティングシステムのコマンドで削除しなければいけません。

                                                Linuxシステムにおいて、ディレクトリ名のセパレータはスラッシュ(/)です。

                                                Windowsシステムにおいて、ディレクトリ名のセパレータは、スラッシュ(/)もしくは2つのバックスラッシュ(\\)で指定することができます。

                                                Linux上のディレクトリ/tmp/empdirempdirという別名を作成します。

                                                  CREATE DIRECTORY empdir AS '/tmp/empdir';

                                                  Windows上のディレクトリC:\TEMP\EMPDIRempdirという別名を作成します。

                                                    CREATE DIRECTORY empdir AS 'C:/TEMP/EMPDIR';

                                                    すべてのディレクトリパスの別名を表示します。

                                                      SELECT * FROM pg_catalog.edb_dir;
                                                        
                                                       dirname |    dirpath  
                                                      ---------+----------------  
                                                       empdir  | C:/TEMP/EMPDIR  
                                                      (1 row)

                                                      ディレクトリパスの別名empdirを削除します。

                                                        DELETE FROM pg_catalog.edb_dir WHERE dirname = 'empdir';

                                                        3.3.13 CREATE FUNCTION

                                                        名前

                                                        CREATE FUNCTION -- 新しい関数を定義する

                                                        概要

                                                        CREATE [ OR REPLACE ] FUNCTION name
                                                          [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
                                                            [, ...]) ]
                                                          RETURN rettype
                                                        [ AUTHID { DEFINER | CURRENT_USER } ]
                                                        { IS | AS }
                                                            [ declaration; ] [, ...]
                                                          BEGIN
                                                            statement; [...]
                                                        [ EXCEPTION
                                                          { WHEN exception [ OR exception ] [...] THEN
                                                              statement; [, ...] } [, ...]
                                                        ]
                                                          END [ name ]

                                                        説明

                                                        CREATE FUNCTIONは新しい関数を定義します。CREATE OR REPLACE FUNCTIONは、新しい関数の作成、または、既存定義の置換のどちらかを行います。

                                                        スキーマ名が含まれている場合、関数は指定されたスキーマで作成されます。スキーマ名がなければ、関数は現在のスキーマで作成されます。同じスキーマ内の同じ引数データ型を持つ既存の関数の名前は、新しい関数の名前として使用できません。しかし、異なる引数データ型を持つ関数であれば、名前が重複しても構いません(これを、オーバーロードと言います)。(関数のオーバーロードはPostgres Plusの機能です。Oracle互換ではありません。)

                                                        既存の関数定義を更新するには、CREATE OR REPLACE FUNCTIONを使用してください。この方法では関数の名前や引数の型を変更することはできないことに注意してください(これを行った場合、新しく別の関数が作成されます)。また、CREATE OR REPLACE FUNCTIONでは、既存の関数の戻り値の型を変更することはできません。戻り値の型を変更したい場合は、その関数を削除し、再度作成してください。

                                                        関数を作成したユーザが、その関数の所有者となります。

                                                        関数の詳しい情報は、4.2.4章を参照ください。

                                                        パラメータ

                                                        name

                                                            作成する関数の名前です(スキーマ修飾名も可)。

                                                        argname

                                                            引数の名前です。引数は関数の中でこの名前で参照できます。

                                                        IN | IN OUT | OUT

                                                            引数のモードです。INは引数が入力引数であることを宣言します。これがデフォルトです。IN OUTは引数が入出力引数、OUTは出力引数であることを宣言します。

                                                        argtype

                                                            関数の引数のデータ型です。基本データ型、または、テーブル列の型の参照を使用することができます。すべての基本データ型で長さを指定してはいけません。例えば、VARCHAR2(10)ではなく、VARCHAR2と指定します。

                                                            列の型を参照するには、tablename.columnname%TYPEと記述します。これを使用すると、テーブル定義が変更されても関数が影響を受けないようにするのに役に立つことがあります。

                                                        DEFAULT value

                                                            関数の呼び出し時に引数が渡されない場合、入力引数としてデフォルトの値が使用されます。引数のモードがIN OUTもしくはOUTの場合、DEFAULTを指定してはいけません。

                                                        rettype

                                                            関数が返すデータの型です。argtypeと同様に、rettypeでも長さを指定してはいけません。

                                                        DEFINER | CURRENT_USER

                                                            関数内で参照するデータベースオブジェクトへのアクセス許可を決定するために、関数の所有者の権限(DEFINER)を使用するのか、関数を実行している現在のユーザの権限(CURRENT_USER)を使用するのかを指定します。また、DEFINERでは修飾されていないデータベースオブジェクトを参照するために、関数の所有者の検索パスが使用されます。一方、CURRENT_USERでは関数を実行している現在のユーザの検索パスが使用されます。DEFINERがデフォルトです。

                                                        declaration

                                                            変数、型、REF CURSOR宣言です。

                                                        statement

                                                            SPLプログラム文です。DECLARE - BEGIN – ENDブロックはSPL文とみなされることに注意してください。したがって、関数内部にはネストしたブロックがある可能性があります。

                                                        exception

                                                            NO_DATA_FOUNDOTHERSなどの例外条件の名前です。

                                                        注釈

                                                        Postgres Plusは関数のオーバーロードを許可します。つまり、引数の型が異なっていれば、複数の関数に同じ名前を使用することができます。

                                                        emp_comp関数は2つの入力引数と1つの戻り値を取ります。以下のSELECTコマンドで関数の使い方を示します。

                                                          CREATE OR REPLACE FUNCTION emp_comp (  
                                                              p_sal           NUMBER,  
                                                              p_comm          NUMBER  
                                                          ) RETURN NUMBER  
                                                          IS  
                                                          BEGIN  
                                                              RETURN (p_sal + NVL(p_comm, 0)) * 24;  
                                                          END;
                                                            
                                                          SELECT ename "Name", sal "Salary", comm "Commission", emp_comp(sal, comm)  
                                                              "Total Compensation"  FROM emp;
                                                            
                                                            Name  | Salary  | Commission | Total Compensation  
                                                          --------+---------+------------+--------------------  
                                                           SMITH  |  800.00 |            |           19200.00  
                                                           ALLEN  | 1600.00 |     300.00 |           45600.00  
                                                           WARD   | 1250.00 |     500.00 |           42000.00  
                                                           JONES  | 2975.00 |            |           71400.00  
                                                           MARTIN | 1250.00 |    1400.00 |           63600.00  
                                                           BLAKE  | 2850.00 |            |           68400.00  
                                                           CLARK  | 2450.00 |            |           58800.00  
                                                           SCOTT  | 3000.00 |            |           72000.00  
                                                           KING   | 5000.00 |            |          120000.00  
                                                           TURNER | 1500.00 |       0.00 |           36000.00  
                                                           ADAMS  | 1100.00 |            |           26400.00  
                                                           JAMES  |  950.00 |            |           22800.00  
                                                           FORD   | 3000.00 |            |           72000.00  
                                                           MILLER | 1300.00 |            |           31200.00  
                                                          (14 行)

                                                          sal_range関数は給料が指定した範囲である従業員数を返します。以下の関数呼び出しでは、最初の2つの呼び出しが引数のデフォルト値を使用しています。

                                                            CREATE OR REPLACE FUNCTION sal_range (  
                                                                p_sal_min       NUMBER DEFAULT 0,  
                                                                p_sal_max       NUMBER DEFAULT 10000  
                                                            ) RETURN INTEGER  
                                                            IS  
                                                                v_count         INTEGER;  
                                                            BEGIN  
                                                                SELECT COUNT(*) INTO v_count FROM emp  
                                                                    WHERE sal BETWEEN p_sal_min AND p_sal_max;  
                                                                RETURN v_count;  
                                                            END;
                                                              
                                                            BEGIN  
                                                                DBMS_OUTPUT.PUT_LINE('Number of employees with a salary: ' ||  
                                                                    sal_range);  
                                                                DBMS_OUTPUT.PUT_LINE('Number of employees with a salary of at least '  
                                                                    || '$2000.00: ' || sal_range(2000.00));  
                                                                DBMS_OUTPUT.PUT_LINE('Number of employees with a salary between '  
                                                                    || '$2000.00 and $3000.00: ' || sal_range(2000.00, 3000.00));
                                                              
                                                            END;
                                                              
                                                            Number of employees with a salary: 14  
                                                            Number of employees with a salary of at least $2000.00: 6  
                                                            Number of employees with a salary between $2000.00 and $3000.00: 5

                                                            関連項目

                                                            DROP FUNCTION

                                                            3.3.14 CREATE INDEX

                                                            名前

                                                            CREATE INDEX -- 新しいインデックスを定義する

                                                            概要

                                                            CREATE [ UNIQUE ] INDEX name ON table
                                                              ( { column | ( expression ) } )
                                                              [ TABLESPACE tablespace ]

                                                            説明

                                                            CREATE INDEXは、指定したテーブル上にnameインデックスを作ります。インデックスは主にデータベースの性能を向上するために使われます(しかし、インデックスの不適切な使用は性能の低下につながる可能性があります)。

                                                            インデックスのキーフィールドは、列名、または括弧に囲まれた式として指定されます。複数列に対するインデックスを作成する場合は、複数のフィールドを指定できます。

                                                            インデックスのフィールドとして、テーブル行の1つ以上の列の値を計算する式を指定できます。この機能は、元のデータに何らかの変換を加えた値を基とするデータへの高速なアクセスを行う手段として使用することができます。例えば、UPPER(col)という計算に基づくインデックスがあれば、WHERE UPPER(col) = 'JIM'句ではインデックスを使用することができます。

                                                            Postgres PlusはB-treeのインデックスメソッドを用意しています。B-treeのインデックスメソッドはLehman-Yao high-concurrency B-treesを実装しています。

                                                            デフォルトでは、インデックスはIS NULL句では使用されません。

                                                            インデックスの定義で使用される全ての関数と演算子は、"不変"(immutable)でなければなりません。つまり、結果は入力引数にのみに依存し、(他のテーブルの内容や現時刻などの)外部からの影響を受けてはなりません。この制限によって、インデックスの動作が十分定義されていることが保証されます。インデックス式にユーザ定義の関数を使用する場合、関数を作成する際、immutable(不変)オプションを付けることを忘れないでください。

                                                            パラメータ

                                                            UNIQUE

                                                                インデックスを(既にデータがある状態で)作成する時、テーブルにデータを追加する時に、テーブル内の値が重複していないかを検査します。重複エントリを生じるデータの挿入または更新はエラーとなります。

                                                            name

                                                                作成するインデックスの名前です。 この名前には、スキーマ名を含めることはできません。インデックスは、常にその親テーブルと同じスキーマに作成されます。

                                                            table

                                                                インデックスを作成するテーブルの名前です(スキーマ修飾名の場合もあります)。

                                                            column

                                                                テーブルの列の名前です。

                                                            expression

                                                                テーブル上の1つ以上の列を使用した式です。通常この式は、構文で示した通り括弧で囲む必要があります。しかし、式が関数呼び出し形式になっている場合は括弧を省略することができます。

                                                            tablespace

                                                                インデックスを生成するテーブル空間です。指定されなかった場合、default_tablespaceが使用されます。default_tablespaceが空文字列である場合は、データベースのデフォルトのテーブル空間が使用されます。

                                                            注釈

                                                            複数列に対するインデックスで指定できる列は、32個までです。

                                                            empテーブルのename列にB-treeインデックスを作成します。

                                                              CREATE INDEX name_idx ON emp (ename);

                                                              index_tblspcテーブル空間内に上記と同じインデックスを作成します。

                                                                CREATE INDEX name_idx ON emp (ename) TABLESPACE index_tblspc;

                                                                関連項目

                                                                ALTER INDEX, DROP INDEX

                                                                3.3.15 CREATE PACKAGE

                                                                名前

                                                                CREATE PACKAGE -- 新しいパッケージ仕様を定義する

                                                                概要

                                                                CREATE [ OR REPLACE ] PACKAGE name
                                                                [ AUTHID { DEFINER | CURRENT_USER } ]
                                                                { IS | AS }
                                                                  [ declaration; ] [, ...]
                                                                  [ { PROCEDURE proc_name
                                                                      [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
                                                                        [, ...]) ];
                                                                    |
                                                                      FUNCTION func_name
                                                                      [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
                                                                        [, ...]) ]
                                                                      RETURN rettype;
                                                                    }
                                                                  ] [, ...]
                                                                  END [ name ]

                                                                説明

                                                                CREATE PACKAGEは新しいパッケージ仕様を定義します。CREATE OR REPLACE PACKAGEは新しいパッケージ仕様の作成、または、既存仕様の置換のどちらかを行います。

                                                                スキーマ名が含まれている場合、パッケージは指定されたスキーマで作成されます。スキーマ名がなければ、パッケージは現在のスキーマで作成されます。新しいパッケージの名前は同じスキーマ内の既存のパッケージの名前と重複してはいけません。CREATE OR REPLACE PACKAGEを使用して既存のパッケージの定義を変更すれば可能です。

                                                                コマンドを実行したユーザがパッケージの所有者になります。

                                                                パッケージに関する詳細は、第6章を参照してください。

                                                                パラメータ

                                                                name

                                                                    作成するパッケージの名前です(スキーマ修飾名も可)。

                                                                DEFINER | CURRENT_USER

                                                                    パッケージ内で参照するデータベースオブジェクトへのアクセス許可を決定するために、パッケージの所有者の権限(DEFINER)を使用するのか、パッケージ内のプログラムを実行している現在のユーザの権限(CURRENT_USER)を使用するのかを指定します。また、DEFINERでは修飾されていないデータベースオブジェクトを参照するために、パッケージの所有者の検索パスが使用されます。一方、CURRENT_USERではパッケージ内のプログラムを実行している現在のユーザの検索パスが使用されます。DEFINERがデフォルトです。

                                                                declaration

                                                                    パブリック変数、型、カーソル、REF CURSOR宣言です。

                                                                proc_name

                                                                    パブリック・プロシージャの名前です。

                                                                argname

                                                                    引数の名前です。

                                                                IN | IN OUT | OUT

                                                                    引数のモードです。

                                                                argtype

                                                                    プログラムの引数のデータ型です。

                                                                DEFAULT value

                                                                    入力引数のデフォルト値です。

                                                                func_name

                                                                    パブリック関数の名前です。

                                                                rettype

                                                                    戻り値のデータ型です。

                                                                empinfoパッケージの仕様には、以下の3つのパブリック要素が含まれます。パブリック変数、パブリック・プロシージャ、パブリック関数の3つです。この例にあるパッケージの本体はCREATE PACKAGE BODYコマンドを参照してください。

                                                                  CREATE OR REPLACE PACKAGE empinfo  
                                                                  IS  
                                                                      emp_name        VARCHAR2(10);  
                                                                      PROCEDURE get_name (  
                                                                          p_empno     NUMBER  
                                                                      );  
                                                                      FUNCTION display_counter  
                                                                      RETURN INTEGER;  
                                                                  END;

                                                                  関連項目

                                                                  CREATE PACKAGE BODY, DROP PACKAGE

                                                                  3.3.16 CREATE PACKAGE BODY

                                                                  名前

                                                                  CREATE PACKAGE BODY -- 新しいパッケージ本体を定義する

                                                                  概要

                                                                  CREATE [ OR REPLACE ] PACKAGE BODY name
                                                                  { IS | AS }
                                                                    [ declaration; ] [, ...]
                                                                    [ { PROCEDURE proc_name
                                                                        [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
                                                                          [, ...]) ]
                                                                      { IS | AS }
                                                                          program_body
                                                                        END [ proc_name ];
                                                                      |
                                                                        FUNCTION func_name
                                                                        [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
                                                                          [, ...]) ]
                                                                        RETURN rettype
                                                                      { IS | AS }
                                                                          program_body
                                                                        END [ func_name ];
                                                                      }
                                                                    ] [, ...]
                                                                    [ BEGIN
                                                                        statement; [, ...] ]
                                                                    END [ name ]

                                                                  説明

                                                                  CREATE PACKAGE BODYは新しいパッケージ本体を定義します。CREATE OR REPLACE PACKAGE BODYは新しいパッケージ本体の作成、または、既存パッケージ本体の置換のどちらかを行います。

                                                                  スキーマ名が含まれている場合、パッケージ本体は指定されたスキーマで作成されます。スキーマ名がなければ、パッケージ本体は現在のスキーマで作成されます。新しいパッケージ本体の名前は同じスキーマ内の既存のパッケージ仕様の名前と一致する必要があります。ただし、新しいパッケージ本体の名前は同じスキーマ内の既存のパッケージ本体の名前と重複してはいけません。CREATE OR REPLACE PACKAGE BODYを使用して既存のパッケージ本体の定義を変更すれば可能です。

                                                                  パッケージ本体に関する詳細は、第0章と第0章を参照してください。

                                                                  パラメータ

                                                                  name

                                                                      作成するパッケージ本体の名前です(スキーマ修飾名も可)。

                                                                  declaration

                                                                      プライベート変数、型、カーソル、REF CURSOR宣言です。

                                                                  proc_name

                                                                      パブリック・プロシージャもしくはプライベート・プロシージャの名前です。proc_nameがパッケージ仕様に定義されている場合、パブリック・プロシージャです。定義されていない場合、プライベート・プロシージャです。

                                                                  argname

                                                                      引数の名前です。

                                                                  IN | IN OUT | OUT

                                                                      引数のモードです。

                                                                  argtype

                                                                      プログラムの引数のデータ型です。

                                                                  DEFAULT value

                                                                      入力引数のデフォルト値です。

                                                                  program_body

                                                                      関数もしくはプロシージャの本体を構成する宣言およびSPL文です。

                                                                  func_name

                                                                      パブリック関数もしくはプライベート関数の名前です。func_nameがパッケージ仕様に定義されている場合、パブリック関数です。定義されていない場合、プライベート関数です。

                                                                  rettype

                                                                      戻り値のデータ型です。

                                                                  statement

                                                                      SPLプログラム文です。初期化処理部分は、パッケージが参照された時に一度だけ実行されます。

                                                                  以下は、empinfoパッケージの本体です。

                                                                    CREATE OR REPLACE PACKAGE BODY empinfo  
                                                                    IS  
                                                                        v_counter       INTEGER;  
                                                                        PROCEDURE get_name (  
                                                                            p_empno     NUMBER  
                                                                        )  
                                                                        IS  
                                                                        BEGIN  
                                                                            SELECT ename INTO emp_name FROM emp WHERE empno = p_empno;  
                                                                            v_counter := v_counter + 1;  
                                                                        END;  
                                                                        FUNCTION display_counter  
                                                                        RETURN INTEGER  
                                                                        IS  
                                                                        BEGIN  
                                                                            RETURN v_counter;  
                                                                        END;  
                                                                    BEGIN  
                                                                        v_counter := 0;  
                                                                        DBMS_OUTPUT.PUT_LINE('Initialized counter');  
                                                                    END;

                                                                    以下の例では、empinfoパッケージのプロシージャと関数を実行して、パブリック変数を表示しています。

                                                                      BEGIN  
                                                                          empinfo.get_name(7369);  
                                                                          DBMS_OUTPUT.PUT_LINE('Employee Name    : ' || empinfo.emp_name);  
                                                                          DBMS_OUTPUT.PUT_LINE('Number of queries: ' || empinfo.display_counter);  
                                                                      END;
                                                                        
                                                                      Initialized counter  
                                                                      Employee Name    : SMITH  
                                                                      Number of queries: 1
                                                                        
                                                                      BEGIN  
                                                                          empinfo.get_name(7900);  
                                                                          DBMS_OUTPUT.PUT_LINE('Employee Name    : ' || empinfo.emp_name);  
                                                                          DBMS_OUTPUT.PUT_LINE('Number of queries: ' || empinfo.display_counter);  
                                                                      END;
                                                                        
                                                                      Employee Name    : JAMES  
                                                                      Number of queries: 2

                                                                      関連項目

                                                                      CREATE PACKAGE, DROP PACKAGE

                                                                      3.3.17 CREATE PROCEDURE

                                                                      名前

                                                                      CREATE PROCEDURE -- 新しいストアド・プロシージャを定義する

                                                                      概要

                                                                      CREATE [ OR REPLACE ] PROCEDURE name
                                                                        [ (argname [ IN | IN OUT | OUT ] argtype [ DEFAULT value ]
                                                                          [, ...]) ]
                                                                      [ AUTHID { DEFINER | CURRENT_USER } ]
                                                                      { IS | AS }
                                                                          [ declaration; ] [, ...]
                                                                        BEGIN
                                                                          statement; [...]
                                                                      [ EXCEPTION
                                                                        { WHEN exception [ OR exception ] [...] THEN
                                                                            statement; [, ...] } [, ...]
                                                                      ]
                                                                        END [ name ]

                                                                      説明

                                                                      CREATE PROCEDUREは新しいストアド・プロシージャを定義します。CREATE OR REPLACE PROCEDUREは新しいプロシージャの作成、または、既存プロシージャの置換のどちらかを行います。

                                                                      スキーマ名が含まれている場合、プロシージャは指定されたスキーマで作成されます。スキーマ名がなければ、プロシージャは現在のスキーマで作成されます。新しいプロシージャの名前は同じスキーマ内の既存のプロシージャの名前と重複してはいけません。CREATE OR REPLACE PROCEDUREを使用して既存のプロシージャの定義を変更すれば可能です。

                                                                      プロシージャを作成したユーザがプロシージャの所有者になります。

                                                                      プロシージャに関する詳細は、第4.2.3章を参照してください。

                                                                      パラメータ

                                                                      name

                                                                          作成するプロシージャの名前です(スキーマ修飾名も可)。

                                                                      argname

                                                                          引数の名前です。引数はプロシージャの中でこの名前で参照できます。

                                                                      IN | IN OUT | OUT

                                                                          引数のモードです。INは引数が入力引数であることを宣言します。これがデフォルトです。IN OUTは引数が入出力引数、OUTは出力引数であることを宣言します。

                                                                      argtype

                                                                          プロシージャの引数のデータ型です。基本データ型、または、テーブル列の型の参照を使用することができます。すべての基本データ型で長さを指定してはいけません。例えば、VARCHAR2(10)ではなく、VARCHAR2と指定します。

                                                                          列の型を参照するには、tablename.columnname%TYPEと記述します。これを使用すると、テーブル定義が変更されてもプロシージャが影響を受けないようにするのに役に立つことがあります。

                                                                      DEFAULT value

                                                                          プロシージャの呼び出し時に引数が渡されない場合、入力引数としてデフォルトの値が使用されます。引数のモードがIN OUTもしくはOUTの場合、DEFAULTを指定してはいけません。

                                                                      DEFINER | CURRENT_USER

                                                                          プロシージャ内で参照するデータベースオブジェクトへのアクセス許可を決定するために、プロシージャの所有者の権限(DEFINER)を使用するのか、プロシージャを実行している現在のユーザの権限(CURRENT_USER)を使用するのかを指定します。また、DEFINERでは修飾されていないデータベースオブジェクトを参照するために、プロシージャの所有者の検索パスが使用されます。一方、CURRENT_USERではプロシージャを実行している現在のユーザの検索パスが使用されます。DEFINERがデフォルトです。

                                                                      declaration

                                                                          変数、型、REF CURSOR宣言です。

                                                                      statement

                                                                          SPLプログラム文です。DECLARE - BEGIN – ENDブロックはSPL文とみなされることに注意してください。したがって、プロシージャ内部にはネストしたブロックがある可能性があります。

                                                                      exception

                                                                          NO_DATA_FOUNDOTHERSなどの例外条件の名前です。

                                                                      以下のプロシージャは、empテーブル内の従業員を表示します。

                                                                        CREATE OR REPLACE PROCEDURE list_emp  
                                                                        IS  
                                                                            v_empno         NUMBER(4);  
                                                                            v_ename         VARCHAR2(10);  
                                                                            CURSOR emp_cur IS  
                                                                                SELECT empno, ename FROM emp ORDER BY empno;  
                                                                        BEGIN  
                                                                            OPEN emp_cur;  
                                                                            DBMS_OUTPUT.PUT_LINE('EMPNO    ENAME');  
                                                                            DBMS_OUTPUT.PUT_LINE('-----    -------');  
                                                                            LOOP  
                                                                                FETCH emp_cur INTO v_empno, v_ename;  
                                                                                EXIT WHEN emp_cur%NOTFOUND;  
                                                                                DBMS_OUTPUT.PUT_LINE(v_empno || '     ' || v_ename);  
                                                                            END LOOP;  
                                                                            CLOSE emp_cur;  
                                                                        END;
                                                                          
                                                                        EXEC list_emp;
                                                                          
                                                                        EMPNO    ENAME  
                                                                        -----    -------  
                                                                        7369     SMITH  
                                                                        7499     ALLEN  
                                                                        7521     WARD  
                                                                        7566     JONES  
                                                                        7654     MARTIN  
                                                                        7698     BLAKE  
                                                                        7782     CLARK  
                                                                        7788     SCOTT  
                                                                        7839     KING  
                                                                        7844     TURNER  
                                                                        7876     ADAMS  
                                                                        7900     JAMES  
                                                                        7902     FORD  
                                                                        7934     MILLER

                                                                        以下のプロシージャでは、従業員番号、名前、仕事を返す引数のモードとして、IN OUTOUTを使用します。最初に、指定された従業員番号をもとに検索します。見つからなかった場合、指定された名前をもとに再検索します。

                                                                          CREATE OR REPLACE PROCEDURE emp_job (  
                                                                              p_empno         IN OUT emp.empno%TYPE,  
                                                                              p_ename         IN OUT emp.ename%TYPE,  
                                                                              p_job           OUT    emp.job%TYPE  
                                                                          )  
                                                                          IS  
                                                                              v_empno         emp.empno%TYPE;  
                                                                              v_ename         emp.ename%TYPE;  
                                                                              v_job           emp.job%TYPE;  
                                                                          BEGIN  
                                                                              SELECT ename, job INTO v_ename, v_job FROM emp WHERE empno = p_empno;  
                                                                              p_ename := v_ename;  
                                                                              p_job   := v_job;  
                                                                              DBMS_OUTPUT.PUT_LINE('Found employee # ' || p_empno);  
                                                                          EXCEPTION  
                                                                              WHEN NO_DATA_FOUND THEN  
                                                                                  BEGIN  
                                                                                      SELECT empno, job INTO v_empno, v_job FROM emp  
                                                                                          WHERE ename = p_ename;  
                                                                                      p_empno := v_empno;  
                                                                                      p_job   := v_job;  
                                                                                      DBMS_OUTPUT.PUT_LINE('Found employee ' || p_ename);  
                                                                                  EXCEPTION  
                                                                                      WHEN NO_DATA_FOUND THEN  
                                                                                          DBMS_OUTPUT.PUT_LINE('Could not find an employee with ' ||  
                                                                                              'number, ' || p_empno || ' nor name, '  || p_ename);  
                                                                                          p_empno := NULL;  
                                                                                          p_ename := NULL;  
                                                                                          p_job   := NULL;  
                                                                                  END;  
                                                                          END;
                                                                            
                                                                          DECLARE  
                                                                              v_empno      emp.empno%TYPE;  
                                                                              v_ename      emp.ename%TYPE;  
                                                                              v_job        emp.job%TYPE;  
                                                                          BEGIN  
                                                                              v_empno := 0;  
                                                                              v_ename := 'CLARK';  
                                                                              emp_job(v_empno, v_ename, v_job);  
                                                                              DBMS_OUTPUT.PUT_LINE('Employee No: ' || v_empno);  
                                                                              DBMS_OUTPUT.PUT_LINE('Name       : ' || v_ename);  
                                                                              DBMS_OUTPUT.PUT_LINE('Job        : ' || v_job);  
                                                                          END;
                                                                            
                                                                          Found employee CLARK  
                                                                          Employee No: 7782  
                                                                          Name       : CLARK  
                                                                          Job        : MANAGER

                                                                          関連項目

                                                                          DROP PROCEDURE

                                                                          3.3.18 CREATE PUBLIC SYNONYM

                                                                          名前

                                                                          CREATE PUBLIC SYNONYM -- 新しいパブリック・シノニムを定義する

                                                                          概要

                                                                          CREATE [ OR REPLACE ] PUBLIC SYNONYM name FOR object

                                                                          説明

                                                                          CREATE PUBLIC SYNONYMはデータベースオブジェクトに対してパブリック・シノニムを定義します。シノニムはオブジェクトの参照に使用できる別名です。パブリック・シノニムはデータベース内で広く利用可能です。データベースクラスタのすべてのユーザが参照できます。

                                                                          CREATE OR REPLACE PUBLIC SYNONYMも同様です。しかしながら、同じ名前のパブリック・シノニムが存在する場合、置き換えられます。

                                                                          通常、データベースオブジェクトはSQL文で正確に参照するため、スキーマ名で完全修飾する必要があります。オブジェクトに対してシノニムを定義すると、修飾のない単一の名前で参照することができるようになるので便利です。

                                                                          パブリック・シノニムに関する詳細は、第2.2.4章を参照してください。

                                                                          パラメータ

                                                                          name

                                                                              作成するパブリック・シノニムの名前です。

                                                                          object

                                                                              パブリック・シノニムが作成されるデータベースオブジェクトの名前です(スキーマ修飾名も可)。データベースオブジェクトはテーブル、ビュー、シーケンス、他のシノニムなどです。

                                                                          注釈

                                                                          すべてのユーザがパブリック・シノニムを作成できます。特別な権限は必要ありません。

                                                                          パブリック・シノニムはすべてのユーザがすべてのSQL文で参照できます。しかしながら、シノニムが参照するデータベースオブジェクトに適切な権限を持っていないユーザの場合、SQL文の実行に失敗します。

                                                                          パブリック・シノニムはスキーマのメンバではありませんが、database-wideの名前です。

                                                                          パブリック・シノニムは存在しないオブジェクトに対しても作成できます。

                                                                          パブリック・シノニムで参照されるデータベースオブジェクトへのアクセス可否は、現在のユーザの権限で決定されます。したがって、パブリック・シノニムのユーザは参照先のデータベースオブジェクトに適切な権限を持っていなければいけません。

                                                                          スキーマ名Postgres Plusempテーブルに対して、パブリック・シノニムpersonnelを作成します。

                                                                            CREATE PUBLIC SYNONYM personnel FOR Postgres Plus.emp;

                                                                            関連項目

                                                                            DROP PUBLIC SYNONYM

                                                                            3.3.19 CREATE ROLE

                                                                            名前

                                                                            CREATE ROLE -- 新しいデータベースロールを定義する

                                                                            概要

                                                                            CREATE ROLE name [ IDENTIFIED BY password ]

                                                                            説明

                                                                            CREATE ROLEは、Postgres Plusデータベースクラスタに新しいロールを加えます。ロールとは、自身でデータベースオブジェクトを所有することができ、データベース権限を持つことができる実体のことです。ロールは、使用状況に応じて"ユーザ"、"グループ"、もしくは、その両方であるとみなすことができます。新しく定義されたロールはLOGIN属性を持ちません。したがって、セッションを開始するために使用できません。LOGIN属性を与えるには、ALTER ROLEコマンドを使用してください。CREATE ROLEコマンドを使用するには、CREATEROLE権限を持つか、データベースのスーパーユーザでなければなりません。

                                                                            IDENTIFIED BY句が指定された場合、CREATE ROLEは新しく作成されるロールと同じ名前のスキーマも作成します。新しく作成されるロールがそのスキーマの所有者となります。

                                                                            ロールはデータベースクラスタのレベルで定義されるため、クラスタ内のすべてのデータベースで有効となることに注意してください。

                                                                            パラメータ

                                                                            name

                                                                                新しいロールの名前です。

                                                                            IDENTIFIED BY password

                                                                                ロールのパスワードを設定します。(パスワードはLOGIN属性を持つロールでのみ意味がありますが、この属性を持たないロールにも定義することができます。)パスワード認証を行う予定がなければ、このオプションを省略することができます。

                                                                            注釈

                                                                            ロールの属性を変更するにはALTER ROLEを、ロールを削除するにはDROP ROLEを使用してください。CREATE ROLEで指定したすべての属性は、後でALTER ROLEコマンドで変更可能です。

                                                                            グループとして使用しているロールのメンバの追加、および、削除についての推奨方法は、GRANTREVOKEを使用することです。

                                                                            ロールの名前とパスワードは最大63文字までです。

                                                                            adminsという名前のパスワード付きのロール(とスキーマ)を作成します。

                                                                              CREATE ROLE admins IDENTIFIED BY Rt498zb;

                                                                              関連項目

                                                                              ALTER ROLE, DROP ROLE, GRANT, REVOKE, SET ROLE

                                                                              3.3.20 CREATE SCHEMA

                                                                              名前

                                                                              CREATE SCHEMA -- 新しいスキーマを定義する

                                                                              概要

                                                                              CREATE SCHEMA AUTHORIZATION username schema_element [ ... ]

                                                                              説明

                                                                              CREATE SCHEMAは、usernameが所有者で1つ以上のオブジェクトが含まれる新しいスキーマを作成します。スキーマとオブジェクトは1つのトランザクション内で作成されるので、すべてのオブジェクトが作成されるか、もしくはスキーマを含むすべてのオブジェクトの作成に失敗するかのいずれかです。(Oracleでは、新しいスキーマは作成されません。usernameとスキーマは事前に存在している必要があります。)

                                                                              スキーマは、本質的には名前空間です。スキーマには、名前付きオブジェクト(テーブル、ビューなど)が含まれます。これらのオブジェクトの名前は、他のスキーマに存在する他のオブジェクトの名前と重複しても構いません。名前付きオブジェクトには、スキーマ名を接頭辞としてオブジェクト名を"修飾"するか、必要なスキーマを含んだ検索パスを設定することによってアクセスできます。オブジェクト名を修飾しないで指定したCREATEコマンドは、そのオブジェクトの現在のスキーマ(CURRENT_SCHEMA関数で決定される検索パスの先頭部分)でオブジェクトを作成します。(検索パスの概念とCURRENT_SCHEMA関数はOracle互換ではありません。)

                                                                              CREATE SCHEMAには、オプションとして、新しいスキーマ内でオブジェクトを作成するためのサブコマンドを付加することができます。サブコマンドは、本質的にはスキーマ作成後に発行される別コマンドと同じように扱われます。ただし、作成された全てのオブジェクトの所有者が指定したユーザになるという点で異なっています。

                                                                              パラメータ

                                                                              username

                                                                                  スキーマを所有するユーザの名前です。スキーマ名もusernameと同じになります。自分以外のユーザを所有者とするスキーマを作成できるのは、スーパーユーザだけです。(Postgres Plusでは、usernameのロールは存在している必要がありますが、スキーマは存在してはいけません。Oracleでは、両方存在している必要があります。)

                                                                              schema_element

                                                                                  そのスキーマ内で作成されるオブジェクトを定義するSQL文です。CREATE SCHEMA内では、CREATE TABLECREATE VIEW、およびGRANTが句として使用可能です。他の種類のオブジェクトは、スキーマ作成後に個別のコマンドを使えば作成できます。

                                                                              注釈

                                                                              スキーマを作成するには、実行するユーザが現在のデータベースにおけるCREATE権限を持っている必要があります。(もちろん、スーパーユーザにはこの制限はありません。)

                                                                              Postgres Plusでは、ここに挙げた書式以外にもCREATE SCHEMAコマンドの書式があります。しかし、それらはOracle互換ではありません。

                                                                                CREATE SCHEMA AUTHORIZATION Postgres Plus  
                                                                                    CREATE TABLE empjobs (ename VARCHAR2(10), job VARCHAR2(9))  
                                                                                    CREATE VIEW managers AS SELECT ename FROM empjobs WHERE job = 'MANAGER'  
                                                                                    GRANT SELECT ON managers TO PUBLIC;

                                                                                3.3.21 CREATE SEQUENCE

                                                                                名前

                                                                                CREATE SEQUENCE -- 新しいシーケンスジェネレータを定義する

                                                                                概要

                                                                                CREATE SEQUENCE name [ INCREMENT BY increment ]
                                                                                  [ { NOMINVALUE | MINVALUE minvalue } ]
                                                                                  [ { NOMAXVALUE | MAXVALUE maxvalue } ]
                                                                                  [ START WITH start ] [ CACHE cache | NOCACHE ] [ CYCLE ]

                                                                                説明

                                                                                CREATE SEQUENCEは、新しいシーケンス番号ジェネレータを作成します。具体的には、新しくnameという名前を持つ、1行だけの特殊なテーブルの作成と初期化を行います。シーケンスジェネレータは、このコマンドを実行したユーザによって所有されます。

                                                                                スキーマ名が与えられている場合、そのシーケンスは指定されたスキーマで作成されます。スキーマ名がなければ、シーケンスは現在のスキーマで作成されます。シーケンス名は、同じスキーマ内の他のシーケンス、テーブル、インデックス、ビューとは異なる名前にする必要があります。

                                                                                シーケンスを作成した後、NEXTVALCURRVAL関数を使用してシーケンスを操作します。この関数については第3.5.8を参照してください。

                                                                                パラメータ

                                                                                name

                                                                                    作成するシーケンスの名前です(スキーマ修飾名も可)。

                                                                                increment

                                                                                    INCREMENT BY increment句は、現在のシーケンスの値から新しいシーケンス値を作成する際の値の増加量を設定します。この句は省略可能です。正の値が指定された時は昇順のシーケンス、負の値が指定された時は降順のシーケンスを作成します。指定がない場合のデフォルト値は1です。

                                                                                NOMINVALUE | MINVALUE minvalue

                                                                                    MINVALUE minvalue句は、シーケンスとして作成する最小値を指定します。この句は省略可能です。この句が指定されなかった場合、もしくは、NOMINVALUEが指定された場合、デフォルトが使用されます。シーケンスのデフォルトの最小値は、昇順の時は1、降順の時は-263-1です。

                                                                                NOMAXVALUE | MAXVALUE maxvalue

                                                                                    MAXVALUE maxvalue句は、シーケンスの最大値を決定します。この句は省略可能です。この句が指定されなかった場合、もしくはNOMAXVALUEが指定された場合、デフォルトが使用されます。シーケンスのデフォルトの最小値は、昇順の時は263-1、降順の時は-1です。

                                                                                start

                                                                                    START WITH start句を使用すると、任意の数からシーケンス番号を開始することができます。この句は省略可能です。デフォルトでは、シーケンス番号が始まる値は、昇順の場合minvalue、降順の場合maxvalueになります。

                                                                                cache

                                                                                    CACHE cacheオプションは、あらかじめ番号を割り当て、メモリに格納しておくシーケンス番号の量を指定します。これによりアクセスを高速にすることができます。最小値は1です(一度に生成する値が1つだけなので、キャッシュがない状態になります)。これがデフォルトになっています。

                                                                                CYCLE

                                                                                    CYCLEオプションを使用すると、シーケンスが限界値(昇順の場合はmaxvalue、降順の場合はminvalue)に達した時、そのシーケンスを周回させることができます。限界値まで達した時、次に生成される番号は、昇順の場合はminvalue、降順の場合はmaxvalueになります。

                                                                                    CYCLEが省略された場合(これがデフォルト)、シーケンスが限界値に達した後NEXTVALを呼び出す時にエラーが発生します。NO CYCLEは、デフォルトの設定を取得するために使用されます。しかしながら、このオプションはOracle互換ではありません。

                                                                                注釈

                                                                                シーケンスはbigint演算に基づいています。そのため、8バイト整数の範囲(-9223372036854775808から9223372036854775807まで)を越えることはできません。比較的古いプラットフォームでは、8バイト整数をサポートするコンパイラがないことがあります。その場合、シーケンスには通常のinteger演算が使用されます(この場合、範囲は-2147483648から+2147483647まで)。

                                                                                シーケンスオブジェクトのcacheとして1より大きな値を設定した場合、そのシーケンスを複数のセッションで同時に使用すると、予想外の結果になる可能性があります。各セッションは、シーケンスオブジェクトへの1回のアクセスの間に、連続するシーケンス値を取得し、キャッシュします。そして、キャッシュした数に応じて、シーケンスオブジェクトのlast_valueを増加させます。この場合、そのセッションは、その後のcache-1回に対しては、あらかじめ取得済みのシーケンス値を返し、シーケンスオブジェクトを変更しません。セッションに割り当てられたが使用されなかったシーケンス番号は、セッションの終了時に全て失われるため、結果としてシーケンスに"穴"ができます。

                                                                                さらに、複数のセッションには個別のシーケンス値が割り当てられることが保証されていますが、全てのセッションが尊重されると、シーケンス値が順番通りにならないことがあります。例えば、cacheが10の場合を考えます。セッションAでは1から10までを確保し、NEXTVAL=1を返します。セッションB では、セッションAがNEXTVAL=2を返す前に、11から20を確保し、NEXTVAL=11を返します。したがって、cacheを1に設定した場合はNEXTVALが連続した値であると考えても問題ありませんが、cacheを1より大きな値に設定した場合は、NEXTVALの値が全て異なることのみが保証され、連続した値であることは保証されません。また、last_valueは、値がNEXTVALによって返されたかどうかに関係なく、いずれかのセッションによって確保された最後の値となります。

                                                                                101から始まるserialという名前の昇順シーケンスを作成します。

                                                                                  CREATE SEQUENCE serial START WITH 101;

                                                                                  このシーケンスから次の番号を選択します。

                                                                                    SELECT serial.NEXTVAL FROM DUAL;
                                                                                      
                                                                                     nextval  
                                                                                    ---------  
                                                                                         101  
                                                                                    (1 row)

                                                                                    NOCACHEオプション付きでsupplier_seqという名前のシーケンスを作成します。

                                                                                      CREATE SEQUENCE supplier_seq  
                                                                                          MINVALUE 1  
                                                                                          START WITH 1  
                                                                                          INCREMENT BY 1  
                                                                                          NOCACHE;

                                                                                      このシーケンスから次の番号を選択します。

                                                                                        SELECT supplier_seq.NEXTVAL FROM DUAL;
                                                                                          
                                                                                         nextval  
                                                                                        ---------  
                                                                                               1  
                                                                                        (1 row)

                                                                                        関連項目

                                                                                        ALTER SEQUENCE, DROP SEQUENCE

                                                                                        3.3.22 CREATE TABLE

                                                                                        名前

                                                                                        CREATE TABLE -- 新しいテーブルを定義する

                                                                                        概要

                                                                                        CREATE [ GLOBAL TEMPORARY ] TABLE table_name (
                                                                                          { column_name data_type [ DEFAULT default_expr ]
                                                                                          [ column_constraint [ ... ] ] | table_constraint } [, ...]
                                                                                          )
                                                                                          [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ]
                                                                                          [ TABLESPACE tablespace ]

                                                                                        column_constraintには、次の構文が入ります。

                                                                                          [ CONSTRAINT constraint_name ]
                                                                                          { NOT NULL |
                                                                                            NULL |
                                                                                            UNIQUE [ USING INDEX TABLESPACE tablespace ] |
                                                                                            PRIMARY KEY [ USING INDEX TABLESPACE tablespace ] |
                                                                                            CHECK (expression) |
                                                                                            REFERENCES reftable [ ( refcolumn ) ]
                                                                                              [ ON DELETE action ] }
                                                                                          [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED |
                                                                                            INITIALLY IMMEDIATE ]

                                                                                        また、table_constraintには、次の構文が入ります。

                                                                                          [ CONSTRAINT constraint_name ]
                                                                                          { UNIQUE ( column_name [, ...] )
                                                                                              [ USING INDEX TABLESPACE tablespace ] |
                                                                                            PRIMARY KEY ( column_name [, ...] )
                                                                                              [ USING INDEX TABLESPACE tablespace ] |
                                                                                            CHECK ( expression ) |
                                                                                            FOREIGN KEY ( column_name [, ...] )
                                                                                                REFERENCES reftable [ ( refcolumn [, ...] ) ]
                                                                                              [ ON DELETE action ] }
                                                                                          [ DEFERRABLE | NOT DEFERRABLE ]
                                                                                          [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]

                                                                                        説明

                                                                                        CREATE TABLEは、現在のデータベースに新しい空のテーブルを作成します。作成したテーブルはこのコマンドを実行したユーザが所有します。

                                                                                        スキーマ名が付けられている場合(例えば、CREATE TABLE myschema.mytable ...)、テーブルは指定されたスキーマで作成されます。スキーマ名がなければ、テーブルは現在のスキーマで作成されます。また、一時テーブルは特別なスキーマに存在するため、一時テーブルの作成時にスキーマ名を与えることはできません。テーブル名は、同じスキーマ内の他のテーブル、シーケンス、インデックス、ビューとは異なる名前にする必要があります。

                                                                                        さらに、CREATE TABLEは、作成するテーブルの1行に対応する複合型のデータ型を作成します。したがって、テーブルは、同じスキーマ内の既存のデータ型と同じ名前を持つことができません。

                                                                                        テーブルは1600以上の列を持つことはできません。(実際には、tuple-length制約のために持つことができる列数はもっと少ないです。)

                                                                                        制約句には、挿入、更新操作を行うために、新しい行、または更新する行が満たさなければならない制約(検査項目)を指定します。制約句は省略可能です。制約は、テーブル内で様々な有効な値の集合を定義する際、役に立つSQLオブジェクトです。

                                                                                        制約の定義にはテーブル制約と列制約という2種類があります。列制約は列定義の一部として定義されます。テーブル制約定義は、特定の列とは結びつけられておらず、複数の列を含有することができます。また、全ての列制約はテーブル制約として記述することができます。列制約は、1つの列にのみ影響する制約のための、簡便な記述方法に過ぎません。

                                                                                        パラメータ

                                                                                        GLOBAL TEMPORARY

                                                                                            このパラメータが指定された場合、テーブルは一時テーブルとして作成されます。一時テーブルは、そのセッションの終わり、場合によっては、現在のトランザクションの終わり(後述のON COMMITを参照)に自動的に削除されます。一時テーブルが存在する場合、同じ名前を持つ既存の永続テーブルは、スキーマ修飾名で参照されていない限り、現在のセッションでは非可視になります。また、一時テーブルは現在のセッション外では非可視になります。(この一時テーブルの仕様はOracle互換ではありません。)一時テーブルで作られるインデックスも、全て自動的に一時的なものとなります。

                                                                                        table_name

                                                                                            作成するテーブルの名前です(スキーマ修飾名でも可)。

                                                                                        column_name

                                                                                            新しいテーブルで作成される列の名前です。

                                                                                        data_type

                                                                                            列のデータ型です。これには、配列指定子が含まれる場合があります。Postgres Plusでサポートされるデータ型の情報に関する詳細は第0章を参照してください。

                                                                                        DEFAULT default_expr

                                                                                            DEFAULT句を列定義に付けると、その列にデフォルトデータ値が割り当てられます。値として指定するのは、任意の無変数式です(副問い合わせと現在のテーブル内の他の列へ交差参照は許可されません)。デフォルト式のデータ型はその列のデータ型と一致する必要があります。

                                                                                            デフォルト式は、全ての挿入操作において、その列に値が指定されていない場合に使用されます。列にデフォルト値がない場合、デフォルト値はnullになります。

                                                                                        CONSTRAINT constraint_name

                                                                                            省略可能な列制約、テーブル制約の名前です。指定されなければ、システムが名前を生成します。

                                                                                        NOT NULL

                                                                                            その列がnull値を持てないことを指定します。

                                                                                        NULL

                                                                                            その列がnull値を持てることを指定します。これがデフォルトです。

                                                                                            この句は非標準的なSQLデータベースとの互換性のためだけに提供されています。新しいアプリケーションでこれを使用するのはお勧めしません。

                                                                                        UNIQUE - 列制約
                                                                                        UNIQUE (column_name
                                                                                        [, ...] ) - テーブル制約

                                                                                            UNIQUE制約は、テーブルの1つまたは複数の列からなるグループが、一意な値のみ持つことを指定します。一意性テーブル制約の動作は一意性列制約と同じですが、さらに複数列にまたがる機能を持ちます。

                                                                                            一意性制約では、null値は等しいとはみなされなせん。

                                                                                            それぞれの一意性テーブル制約には、そのテーブルの他の一意性制約もしくはプライマリキー制約によって名付けられた列の集合とは、異なる名前の列の集合を指定しなければなりません(同じ名前を指定すると、同じ制約が2回現れるだけになります)。

                                                                                        PRIMARY KEY - 列制約
                                                                                        PRIMARY KEY
                                                                                        ( column_name [, ...] ) - テーブル制約

                                                                                            プライマリキー制約は、テーブルの1列または複数列が一意な(重複がない)、非null値のみを持つことを指定します。技術的には、PRIMARY KEYは単なるUNIQUENOT NULLの組み合わせです。しかし、プライマリキーであることは他のテーブルがその列集合を一意な行識別子とみなせることを意味するので、列集合をプライマリキーと特定すると、スキーマ設計に関するメタデータを提供することになります。

                                                                                            列制約であるかテーブル制約であるかにかかわらず、1つのテーブルに指定できるプライマリキーは1つだけです。

                                                                                            プライマリキー制約には、そのテーブルに定義された他の一意性制約で指名された列の集合とは違う組み合わせの列の集合を指定しなければなりません。

                                                                                        CHECK (expression)

                                                                                            CHECK句は、挿入や更新操作を行うために、新しい行、または変更する行が満たさなければならない、Boolean型の結果を返す式を指定します。式の評価がtrueもしくはunknownとなれば成功です。行の挿入、更新操作の結果、式がfalseとなる場合は、エラー例外が生成され、挿入や更新によるデータベースの変更は行われません。列制約として指定された検査制約は、その列の値のみを参照しなければなりません。一方、テーブル制約として現れる式は、複数列を参照することができます。

                                                                                            現在、CHECK式には、副問い合わせや現在の行の列以外の値を含むことはできません。

                                                                                        REFERENCES reftable [ ( refcolumn ) ] [ ON DELETE action ] - 列制約
                                                                                        FOREIGN KEY
                                                                                        ( column [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ ON DELETE action ] - テーブル制約

                                                                                            これらの句は、外部キー制約を指定します。外部キー制約は、新しいテーブルの1つまたは複数の列の集合が、被参照テーブルの一部の行の被参照列(複数可)に一致する値を持たなければならないことを指定するものです。refcolumnが省略された場合、reftableのプライマリキーが使用されます。被参照列は、被参照テーブルにおいて一意性制約もしくはプライマリキー制約を持った列でなければなりません。

                                                                                            さらに、被参照列のデータが変更された場合、このテーブルの列のデータに何らかの動作が発生します。ON DELETE句は、被参照テーブルの被参照行が削除された場合の動作を指定します。制約が遅延可能と宣言されていても、参照動作は遅延させられません。各句について、以下の動作を指定可能です。

                                                                                            CASCADE

                                                                                              削除された行を参照している行は全て削除します。また、参照している列の値を、被参照列の新しい値にします。

                                                                                            SET NULL

                                                                                              参照する列(複数可)をnullに設定します。

                                                                                            被参照列が頻繁に更新される場合、外部キー列にインデックスを付け、その外部キー列に関連する参照動作がより効率的に実行できるようにする方が良いでしょう。

                                                                                        DEFERRABLE
                                                                                        NOT DEFERRABLE

                                                                                            制約を遅延させることが可能かどうかを制御します。遅延不可の制約は各コマンドの後すぐに検査されます。遅延可能な制約の検査は、(SET CONSTRAINTSコマンドを使用して)トランザクションの終了時まで遅延させることができます。NOT DEFERRABLEがデフォルトです。現在、外部キー制約のみがこの句を受け付けることができます。他の制約は遅延させることができません。

                                                                                        INITIALLY IMMEDIATE
                                                                                        INITIALLY DEFERRED

                                                                                            制約が遅延可能な場合、この句は制約検査を行うデフォルトの時期を指定します。制約がINITIALLY IMMEDIATEの場合、各文の実行後に検査されます。これがデフォルトです。制約がINITIALLY DEFERREDの場合、トランザクションの終了時にのみ検査されます。制約検査の時期はSET CONSTRAINTSコマンドを使用して変更することができます。

                                                                                        ON COMMIT

                                                                                            ON COMMITを使用して、トランザクションブロックの終了時点での一時テーブルの動作を制御することができます。以下の2つのオプションがあります。

                                                                                            PRESERVE ROWS

                                                                                              トランザクションの終了時点で、特別な動作は行われません。これがデフォルトの動作です。(この仕様はOracle互換ではありません。Oracleでのデフォルトの動作はDELETE ROWSです。)

                                                                                            DELETE ROWS

                                                                                              一時テーブル内の全ての行は、各トランザクションブロックの終わりで削除されます。基本的には、コミットの度に自動的にTRUNCATEが実行されます。

                                                                                        TABLESPACE tablespace

                                                                                            tablespaceは、新しいテーブルが作成されるテーブル空間名です。指定されていない場合、default_tablespaceが使用されます。default_tablespaceが空文字列であれば、データベースのデフォルトのテーブル空間が使用されます。

                                                                                        USING INDEX TABLESPACE tablespace

                                                                                            この句により、UNIQUEまたはPRIMARY KEY制約に関連したインデックスを作成するテーブル空間を選択することができます。指定されていない場合、default_tablespaceが使用されます。default_tablespaceが空文字列であれば、データベースのデフォルトのテーブル空間が使用されます。

                                                                                        注釈

                                                                                        Postgres Plusは自動的に各一意性制約とプライマリキー制約に対してインデックスを作成し、その一意性を確実なものにします。したがって、プライマリキーの列に明示的なインデックスを作成することは必要ありません(詳細についてはCREATE INDEXを参照してください)。

                                                                                        deptテーブルとempテーブルを作成します。

                                                                                          CREATE TABLE dept (  
                                                                                              deptno          NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,  
                                                                                              dname           VARCHAR2(14),  
                                                                                              loc             VARCHAR2(13)  
                                                                                          );  
                                                                                          CREATE TABLE emp (  
                                                                                              empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,  
                                                                                              ename           VARCHAR2(10),  
                                                                                              job             VARCHAR2(9),  
                                                                                              mgr             NUMBER(4),  
                                                                                              hiredate        DATE,  
                                                                                              sal             NUMBER(7,2),  
                                                                                              comm            NUMBER(7,2),  
                                                                                              deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk  
                                                                                                                  REFERENCES dept(deptno)  
                                                                                          );

                                                                                          deptテーブルに 一意性テーブル制約を定義します。一意性テーブル制約はテーブルの1つ以上の列に定義することができます。

                                                                                            CREATE TABLE dept (  
                                                                                                deptno          NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,  
                                                                                                dname           VARCHAR2(14) CONSTRAINT dept_dname_uq UNIQUE,  
                                                                                                loc             VARCHAR2(13)  
                                                                                            );

                                                                                            検査列制約を定義します。

                                                                                              CREATE TABLE emp (  
                                                                                                  empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,  
                                                                                                  ename           VARCHAR2(10),  
                                                                                                  job             VARCHAR2(9),  
                                                                                                  mgr             NUMBER(4),  
                                                                                                  hiredate        DATE,  
                                                                                                  sal             NUMBER(7,2) CONSTRAINT emp_sal_ck CHECK (sal > 0),  
                                                                                                  comm            NUMBER(7,2),  
                                                                                                  deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk  
                                                                                                                      REFERENCES dept(deptno)  
                                                                                              );

                                                                                              検査テーブル制約を定義します。

                                                                                                CREATE TABLE emp (  
                                                                                                    empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,  
                                                                                                    ename           VARCHAR2(10),  
                                                                                                    job             VARCHAR2(9),  
                                                                                                    mgr             NUMBER(4),  
                                                                                                    hiredate        DATE,  
                                                                                                    sal             NUMBER(7,2),  
                                                                                                    comm            NUMBER(7,2),  
                                                                                                    deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk  
                                                                                                                        REFERENCES dept(deptno),  
                                                                                                    CONSTRAINT new_emp_ck CHECK (ename IS NOT NULL AND empno > 7000)  
                                                                                                );

                                                                                                jobhistテーブルにプライマリキーテーブル制約を定義します。プライマリキーテーブル制約はテーブルの1つ以上の列に定義することができます。

                                                                                                  CREATE TABLE jobhist (  
                                                                                                      empno           NUMBER(4) NOT NULL,  
                                                                                                      startdate       DATE NOT NULL,  
                                                                                                      enddate         DATE,  
                                                                                                      job             VARCHAR2(9),  
                                                                                                      sal             NUMBER(7,2),  
                                                                                                      comm            NUMBER(7,2),  
                                                                                                      deptno          NUMBER(2),  
                                                                                                      chgdesc         VARCHAR2(80),  
                                                                                                      CONSTRAINT jobhist_pk PRIMARY KEY (empno, startdate)  
                                                                                                  );

                                                                                                  以下では、job列のデフォルト値にリテラル定数を割り当てています。また、hiredate列のデフォルト値は、その行が挿入された日時となります。

                                                                                                    CREATE TABLE emp (  
                                                                                                        empno           NUMBER(4) NOT NULL CONSTRAINT emp_pk PRIMARY KEY,  
                                                                                                        ename           VARCHAR2(10),  
                                                                                                        job             VARCHAR2(9) DEFAULT 'SALESMAN',  
                                                                                                        mgr             NUMBER(4),  
                                                                                                        hiredate        DATE DEFAULT SYSDATE,  
                                                                                                        sal             NUMBER(7,2),  
                                                                                                        comm            NUMBER(7,2),  
                                                                                                        deptno          NUMBER(2) CONSTRAINT emp_ref_dept_fk  
                                                                                                                            REFERENCES dept(deptno)  
                                                                                                    );

                                                                                                    diskvol1テーブル空間にdeptテーブルを作成します。

                                                                                                      CREATE TABLE dept (  
                                                                                                          deptno          NUMBER(2) NOT NULL CONSTRAINT dept_pk PRIMARY KEY,  
                                                                                                          dname           VARCHAR2(14),  
                                                                                                          loc             VARCHAR2(13)  
                                                                                                      ) TABLESPACE diskvol1;

                                                                                                      関連項目

                                                                                                      ALTER TABLE, DROP TABLE

                                                                                                      3.3.23 CREATE TABLE AS

                                                                                                      名前

                                                                                                      CREATE TABLE AS -- 問い合わせの結果によって新しいテーブルを定義する

                                                                                                      概要

                                                                                                      CREATE [ GLOBAL TEMPORARY ] TABLE table_name
                                                                                                        [ (column_name [, ...] ) ]
                                                                                                        [ ON COMMIT { PRESERVE ROWS | DELETE ROWS } ]
                                                                                                        [ TABLESPACE tablespace ]
                                                                                                        AS query

                                                                                                      説明

                                                                                                      CREATE TABLE ASはテーブルを作成し、SELECTコマンドによって算出されたデータをそのテーブルに格納します。テーブルの列は、SELECTの出力列に結び付いた名前とデータ型を持ちます(ただし、新しい列名を明示したリストを渡すと、この列名を上書きすることができます)。

                                                                                                      CREATE TABLE ASはビューの作成と似ていますが、実際にはまったく異なります。CREATE TABLE ASは新しいテーブルを作成し、新しいテーブルの内容を初期化するために一度だけ問い合わせを評価します。それ以降に行われた、問い合わせの元テーブルに対する変更は、新しいテーブルには反映されません。反対に、ビューは問い合わせの度に定義されたSELECT文を再評価します。

                                                                                                      パラメータ

                                                                                                      GLOBAL TEMPORARY

                                                                                                          指定された場合、テーブルは一時テーブルとして作成されます。詳細はCREATE TABLEを参照してください。

                                                                                                      table_name

                                                                                                          作成するテーブルの名前です(スキーマ修飾名も可)。

                                                                                                      column_name

                                                                                                          新しいテーブルにおける列の名前です。列名を指定しない場合は、問い合わせの出力列名を利用します。

                                                                                                      query

                                                                                                          SELECTコマンドです。可能な構文の情報はSELECTを参照してください。

                                                                                                      関連項目

                                                                                                      CREATE TABLE, SELECT

                                                                                                      3.3.24 CREATE TRIGGER

                                                                                                      名前

                                                                                                      CREATE TRIGGER -- 新しいトリガを定義する

                                                                                                      概要

                                                                                                      CREATE [ OR REPLACE ] TRIGGER name
                                                                                                        { BEFORE | AFTER }
                                                                                                        { INSERT | UPDATE | DELETE }
                                                                                                            [ OR { INSERT | UPDATE | DELETE } ] [, ...]
                                                                                                          ON table
                                                                                                        [ FOR EACH ROW ]
                                                                                                        [ DECLARE
                                                                                                            declaration; [, ...] ]
                                                                                                          BEGIN
                                                                                                            statement; [, ...]
                                                                                                        [ EXCEPTION
                                                                                                          { WHEN exception [ OR exception ] [...] THEN
                                                                                                              statement; [, ...] } [, ...]
                                                                                                        ]
                                                                                                          END

                                                                                                      説明

                                                                                                      CREATE TRIGGERは新しいトリガを作成します。CREATE OR REPLACE TRIGGERは新しいトリガの作成、または、既存トリガの置換のどちらかを行います。

                                                                                                      新しいトリガの名前は同じテーブルに定義された既存のトリガの名前と重複してはいけません。CREATE OR REPLACE TRIGGERを使用して既存のトリガの定義を変更すれば可能です。

                                                                                                      トリガはトリガが定義されたテーブルと同じスキーマ内に作成されます。

                                                                                                      トリガに関するより詳細な情報については、第5章を参照してください。

                                                                                                      パラメータ

                                                                                                      name

                                                                                                          作成するトリガの名前です。

                                                                                                      BEFORE | AFTER

                                                                                                          関数の呼び出しをイベントの前に行うか後に行うかを決定します。

                                                                                                      INSERT | UPDATE | DELETE

                                                                                                          トリガを起動するイベントを指定します。

                                                                                                      table

                                                                                                          トリガを起動するイベントが起こるテーブルの名前です。

                                                                                                      FOR EACH ROW

                                                                                                          このパラメータは、トリガプロシージャを、トリガイベントによって影響を受ける行ごとに1回起動するか、SQL文ごとに1回のみ起動するかを指定します。指定された場合は、影響を受ける行ごとに1回起動します。指定されない場合は、SQL文ごとに1回のみ起動します。

                                                                                                      declaration

                                                                                                          変数、型、REF CURSOR宣言です。

                                                                                                      statement

                                                                                                          SPLプログラム文です。DECLARE - BEGIN – ENDブロックはSPL文とみなされることに注意してください。したがって、トリガ内部にはネストしたブロックがある可能性があります。

                                                                                                      exception

                                                                                                          NO_DATA_FOUNDOTHERSなどの例外条件の名前です。

                                                                                                      以下は、SQL文ごとに起動するトリガです。empテーブルへのINSERT、UPDATE、DELETEが実行される度に起動します。

                                                                                                        CREATE OR REPLACE TRIGGER user_audit_trig  
                                                                                                            AFTER INSERT OR UPDATE OR DELETE ON emp  
                                                                                                        DECLARE  
                                                                                                            v_action        VARCHAR2(24);  
                                                                                                        BEGIN  
                                                                                                            IF INSERTING THEN  
                                                                                                                v_action := ' added employee(s) on ';  
                                                                                                            ELSIF UPDATING THEN  
                                                                                                                v_action := ' updated employee(s) on ';  
                                                                                                            ELSIF DELETING THEN  
                                                                                                                v_action := ' deleted employee(s) on ';  
                                                                                                            END IF;  
                                                                                                            DBMS_OUTPUT.PUT_LINE('User ' || USER || v_action ||  
                                                                                                                TO_CHAR(SYSDATE,'YYYY-MM-DD'));  
                                                                                                        END;

                                                                                                        以下は、影響を受ける行ごとに起動するトリガです。empテーブルへのINSERT、UPDATE、DELETEが各行に対して実行される前に起動します。

                                                                                                          CREATE OR REPLACE TRIGGER emp_sal_trig  
                                                                                                              BEFORE DELETE OR INSERT OR UPDATE ON emp  
                                                                                                              FOR EACH ROW  
                                                                                                          DECLARE  
                                                                                                              sal_diff       NUMBER;  
                                                                                                          BEGIN  
                                                                                                              IF INSERTING THEN  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('Inserting employee ' || :NEW.empno);  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('..New salary: ' || :NEW.sal);  
                                                                                                              END IF;  
                                                                                                              IF UPDATING THEN  
                                                                                                                  sal_diff := :NEW.sal - :OLD.sal;  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('Updating employee ' || :OLD.empno);  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('..Old salary: ' || :OLD.sal);  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('..New salary: ' || :NEW.sal);  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('..Raise     : ' || sal_diff);  
                                                                                                              END IF;  
                                                                                                              IF DELETING THEN  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('Deleting employee ' || :OLD.empno);  
                                                                                                                  DBMS_OUTPUT.PUT_LINE('..Old salary: ' || :OLD.sal);  
                                                                                                              END IF;  
                                                                                                          END;

                                                                                                          関連項目

                                                                                                          DROP TRIGGER

                                                                                                          3.3.25 CREATE USER

                                                                                                          名前

                                                                                                          CREATE USER -- 新しいデータベースユーザアカウントを定義する

                                                                                                          概要

                                                                                                          CREATE USER name IDENTIFIED BY password

                                                                                                          説明

                                                                                                          CREATE USERは、Postgres Plusデータベースクラスタに新しいユーザを加えます。CREATE USERコマンドを使用するには、データベースのスーパーユーザでなければなりません。

                                                                                                          CREATE USERを使用した場合、新しく作成されるユーザと同じ名前のスキーマも作成されます。新しく作成されるユーザがそのスキーマの所有者となります。このユーザが修飾されていないオブジェクトを作成する場合、オブジェクトはこのスキーマ内で作成されます。

                                                                                                          パラメータ

                                                                                                          name

                                                                                                              ユーザの名前です。

                                                                                                          password

                                                                                                              ユーザのパスワードを設定します。パスワードはALTER USERを使用して後で変更できます。

                                                                                                          注釈

                                                                                                          ユーザの名前とパスワードは最大63文字までです。

                                                                                                          johnという名前のユーザを作成します。

                                                                                                            CREATE USER john IDENTIFIED BY abc;

                                                                                                            関連項目

                                                                                                            ALTER USER, DROP USER

                                                                                                            3.3.26 CREATE VIEW

                                                                                                            名前

                                                                                                            CREATE VIEW -- 新しいビューを定義する

                                                                                                            概要

                                                                                                            CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ]
                                                                                                              AS query

                                                                                                            説明

                                                                                                            CREATE VIEWは問い合わせによるビューを定義します。ビューは物理的な実体として存在するものではありません。その代わり、問い合わせでビューが参照される度に、指定された問い合わせが実行されます。

                                                                                                            CREATE OR REPLACE VIEWも同様の働きをしますが、このコマンドでは、同じ名前のビューが既に存在している場合、そのビューを置き換えます。

                                                                                                            スキーマ名が付けられている場合(例えば、CREATE VIEW myschema.myview ...)、ビューは指定されたスキーマで作成されます。スキーマ名がなければ、そのビューは現在のスキーマで作成されます。ビュー名は、同じスキーマ内の他のビュー、テーブル、シーケンス、インデックスとは異なる名前である必要があります。

                                                                                                            パラメータ

                                                                                                            name

                                                                                                                作成するビューの名前です(スキーマ修飾名も可)。

                                                                                                            column_name

                                                                                                                ビューの列名として使用する名前のリストです。このパラメータは省略可能です。省略された場合、問い合わせに由来する名前が使用されます。

                                                                                                            query

                                                                                                                ビューの列と行を生成するSELECTコマンドです。

                                                                                                            可能な構文の情報はSELECTを参照してください。

                                                                                                            注釈

                                                                                                            現在のところ、ビューは読み取り専用です。システムは、ビューに対する挿入、更新、削除を許可しません。しかし、ビューに対する挿入などを他のテーブルに対する処理に書き換えるルールを作成することで、更新可能なビューと同じように扱うことができます。詳細については、「Postgres Plus Advanced Server documentation」にあるCREATE RULEコマンドを参照してください。

                                                                                                            ビューが参照するテーブルにアクセスできるかどうかは、ビューの所有者の権限で決定されます。しかし、ビュー内で実行される関数については、ビューを使用した問い合わせにおいて、その関数が直接呼び出された場合と同様に扱われます。したがって、ビューを使用するユーザには、ビュー内で使用される全ての関数を呼び出す権限が必要です。

                                                                                                            deptnoが30のすべての従業員からなるビューを作成します。

                                                                                                              CREATE VIEW dept_30 AS SELECT * FROM emp WHERE deptno = 30;

                                                                                                              関連項目

                                                                                                              DROP VIEW

                                                                                                              3.3.27 DELETE

                                                                                                              名前

                                                                                                              DELETE -- テーブルから行を削除する

                                                                                                              概要

                                                                                                              DELETE [ optimizer_hint ] FROM table[@dblink ]
                                                                                                                [ WHERE condition ] 
                                                                                                                [ RETURNING return_expression [, ...]
                                                                                                                    { INTO { record | variable [, ...] }
                                                                                                                    | BULK COLLECT INTO collection [, ...] } ]

                                                                                                              説明

                                                                                                              DELETEは、指定したテーブルからWHERE句を満たす行を削除します。WHEREがない場合、指定したテーブルの全ての行を削除することになります。この結果、そのテーブルは存在するが中身が空のテーブルになります。

                                                                                                              ティップ: TRUNCATEコマンドは、より高速に、テーブルから全ての行を削除する仕組みを持っています。

                                                                                                              DELETEコマンドがSPLプログラム内で使用される場合のみ、RETURNING INTO { record | variable [, ...] }句を指定できます。さらに、DELETEコマンドの結果は1行以下でなければいけません。結果が2行以上の場合は例外が発生します。結果が空の場合、recordもしくはvariableにはnullが代入されます。

                                                                                                              DELETEコマンドがSPLプログラム内で使用される場合のみ、RETURNING BULK COLLECT INTO collection [, ...]句を指定できます。BULK COLLECT INTO句の対象として複数のcollectionが指定された場合、各collectionは単一のスカラーフィールドでなければいけません。つまり、collectionはレコードではいけません。DELETEコマンドの結果、行が全く削除されないか、複数の行が削除されます。結果の各行に対して評価されるreturn_expressioncollectionの要素になります。collection内の既存の行は削除されます。結果が空の場合、collectionは空になります。

                                                                                                              削除を実行するには、そのテーブルのDELETE権限が必要です。また、conditionで使用する値を読み取るために、その値が含まれるテーブルに対するSELECT権限も必要です。

                                                                                                              パラメータ

                                                                                                              optimizer_hint

                                                                                                                  オプティマイザが実行計画を選択する時に使用するコメント内に置かれるヒントです。オプティマイザ・ヒントに関する詳細は、第3.4章を参照してください。

                                                                                                              table

                                                                                                                  既存のテーブル名です(スキーマ修飾名も可)。

                                                                                                              dblink

                                                                                                                  リモートのデータベースを識別するデータベースリンクの名前です。データベースリンクに関する詳細は、CREATE DATABASE LINKコマンドを参照してください。

                                                                                                              condition

                                                                                                                  削除すべき行を決定する、BOOLEAN型の値を返す式です。

                                                                                                              return_expression

                                                                                                                  tableの1つ以上の列を含む式です。return_expressiontableの列名が指定された場合、return_expressionの評価後に列に代入される値は削除された行の値です。

                                                                                                              record

                                                                                                                  return_expressionで評価された結果が割り当てられるレコードです。return_expressionでの最初の結果がrecord内の最初の項目に割り当てられます。2番目の結果が2番目の項目に割り当てられます。以下、同様です。record内の項目数は式の数と同じでなければいけません。また、項目は対応する式と型に互換性がなければいけません。

                                                                                                              variable

                                                                                                                  return_expressionで評価された結果が割り当てられる変数です。1つ以上のreturn_expressionvariableが指定された場合、return_expressionでの最初の結果が最初のvariableに割り当てられます。2番目の結果が2番目のvariableに割り当てられます。以下、同様です。INTOに続いて指定される変数の数は、RETURNINGに続いて指定される式の数と同じでなければいけません。また、変数は対応する式と型に互換性がなければいけません。

                                                                                                              collection

                                                                                                                  return_expressionで評価された結果から作成される要素の集合です。単一の集合、つまり単一フィールドの集合かもしれませんし、レコード型の集合かもしれません。もしくは、各集合が単一フィールドからなる複数の集合かもしれません。式の数は、すべての指定した集合のフィールド数と同じでなければいけません。また、対応するreturn_expressioncollectionフィールドは型に互換性がなければいけません。

                                                                                                              Jobhistテーブルからempnoが7900の従業員を全て削除します。

                                                                                                                DELETE FROM jobhist WHERE empno = 7900;

                                                                                                                jobhistテーブルを空にします。

                                                                                                                  DELETE FROM jobhist;

                                                                                                                  関連項目

                                                                                                                  TRUNCATE

                                                                                                                  3.3.28 DROP DATABASE LINK

                                                                                                                  名前

                                                                                                                  DROP DATABASE LINK -- データベースリンクを削除する

                                                                                                                  概要

                                                                                                                  DROP [ PUBLIC ] DATABASE LINK name

                                                                                                                  説明

                                                                                                                  DROP DATABASE LINKは既存のデータベースリンクを削除します。このコマンドを実行できるのは、スーパーユーザまたはそのデータベースリンクの所有者です。

                                                                                                                  パラメータ

                                                                                                                  name

                                                                                                                      削除するデータベースリンクの名前です。

                                                                                                                  PUBLIC

                                                                                                                      nameがパブリック・データベースリンクであることを示します。

                                                                                                                  oralinkという名前のパブリック・データベースリンクを削除します。

                                                                                                                    DROP PUBLIC DATABASE LINK oralink;

                                                                                                                    edblinkという名前のプライベート・データベースリンクを削除します。

                                                                                                                      DROP DATABASE LINK edblink;

                                                                                                                      関連項目

                                                                                                                      CREATE DATABASE LINK

                                                                                                                      3.3.29 DROP FUNCTION

                                                                                                                      名前

                                                                                                                      DROP FUNCTION -- 関数を削除する

                                                                                                                      概要

                                                                                                                      DROP FUNCTION name [ ([ type [, ...] ]) ]

                                                                                                                      説明

                                                                                                                      DROP FUNCTIONは既存の関数定義を削除します。このコマンドを実行できるのは、スーパーユーザまたはその関数の所有者です。引数が1つでもある場合、関数の引数の型は必ず指定しなければなりません。(この要求仕様はOracle互換ではありません。Postgres Plusは関数のオーバーロードを許可します。したがって、Postgres PlusのDROP FUNCTIONコマンドは関数のシグネチャを要求します。)

                                                                                                                      パラメータ

                                                                                                                      name

                                                                                                                          既存の関数の名前です(スキーマ修飾名も可)。

                                                                                                                      type

                                                                                                                          関数の引数のデータの型です。

                                                                                                                      次のコマンドはemp_comp関数を削除します。

                                                                                                                        DROP FUNCTION emp_comp(NUMBER, NUMBER);

                                                                                                                        関連項目

                                                                                                                        CREATE FUNCTION

                                                                                                                        3.3.30 DROP INDEX

                                                                                                                        名前

                                                                                                                        DROP INDEX -- インデックスの削除

                                                                                                                        概要

                                                                                                                        DROP INDEX name

                                                                                                                        説明

                                                                                                                        DROP INDEXはデータベースシステムから既存のインデックスを削除します。このコマンドを実行できるのは、スーパーユーザまたはそのインデックスの所有者です。何らかのオブジェクトがそのインデックスに依存している場合、エラーが発生し、インデックスは削除されません。

                                                                                                                        パラメータ

                                                                                                                        name

                                                                                                                            削除するインデックスの名前です(スキーマ修飾名も可)。

                                                                                                                        次のコマンドはname_idxインデックスを削除します。

                                                                                                                          DROP INDEX name_idx;

                                                                                                                          関連項目

                                                                                                                          ALTER INDEX, CREATE INDEX

                                                                                                                          3.3.31 DROP PACKAGE

                                                                                                                          名前

                                                                                                                          DROP PACKAGE -- パッケージを削除する

                                                                                                                          概要

                                                                                                                          DROP PACKAGE [ BODY ] name

                                                                                                                          説明

                                                                                                                          DROP PACKAGEは既存のパッケージを削除します。このコマンドを実行できるのは、スーパーユーザまたはそのパッケージの所有者です。BODYが指定された場合、パッケージ本体のみが削除されます。パッケージ仕様は削除されません。BODYが省略された場合は、両方とも削除されます。

                                                                                                                          パラメータ

                                                                                                                          name

                                                                                                                              削除するパッケージの名前です(スキーマ修飾名も可)。

                                                                                                                          emp_adminパッケージを削除します。

                                                                                                                            DROP PACKAGE emp_admin;

                                                                                                                            関連項目

                                                                                                                            CREATE PACKAGE, CREATE PACKAGE BODY

                                                                                                                            3.3.32 DROP PROCEDURE

                                                                                                                            名前

                                                                                                                            DROP PROCEDURE -- プロシージャを削除する

                                                                                                                            概要

                                                                                                                            DROP PROCEDURE name

                                                                                                                            説明

                                                                                                                            DROP PROCEDUREは既存のプロシージャを削除します。このコマンドを実行できるのは、スーパーユーザまたはそのプロシージャの所有者です。

                                                                                                                            パラメータ

                                                                                                                            name

                                                                                                                                削除するプロシージャの名前です(スキーマ修飾名も可)。

                                                                                                                            select_empプロシージャを削除します。

                                                                                                                              DROP PROCEDURE select_emp;

                                                                                                                              関連項目

                                                                                                                              CREATE PROCEDURE

                                                                                                                              3.3.33 DROP PUBLIC SYNONYM

                                                                                                                              名前

                                                                                                                              DROP PUBLIC SYNONYM -- パブリック・シノニムを削除する

                                                                                                                              概要

                                                                                                                              DROP PUBLIC SYNONYM name

                                                                                                                              説明

                                                                                                                              DROP PUBLIC SYNONYMは既存のパブリック・シノニムを削除します。このコマンドを実行できるのは、スーパーユーザまたはそのパブリック・シノニムの所有者です。

                                                                                                                              パブリック・シノニムに関する詳細は、第2.2.4章を参照してください。

                                                                                                                              パラメータ

                                                                                                                              name

                                                                                                                                  削除するパブリック・シノニムの名前です。

                                                                                                                              personnelパブリック・シノニムを削除します。

                                                                                                                                DROP PUBLIC SYNONYM personnel;

                                                                                                                                関連項目

                                                                                                                                CREATE PUBLIC SYNONYM

                                                                                                                                3.3.34 DROP ROLE

                                                                                                                                名前

                                                                                                                                DROP ROLE -- データベースロールを削除する

                                                                                                                                概要

                                                                                                                                DROP ROLE name [ CASCADE ]

                                                                                                                                説明

                                                                                                                                DROP ROLEは指定したロールを削除します。スーパーユーザロールを削除するには、自身もスーパーユーザでなければなりません。スーパーユーザ以外のロールを削除するには、CREATEROLE権限を持たなければなりません。

                                                                                                                                データベースクラスタのいずれかから参照されている場合、ロールを削除することができません。削除しようとしてもエラーとなります。ロールを削除する前に、そのロールが所有するオブジェクトすべてを削除(またはその所有権を変更)しなければなりません。また、そのロールが付与した権限も取り上げなければなりません。

                                                                                                                                しかし、ロール内のロールメンバ資格を削除する必要はありません。DROP ROLEは自動的に他のロール内にある対象ロールと対象ロール内にある他のロールのメンバ資格を取り上げます。他のロールは削除されることも何らかの影響を受けることもありません。

                                                                                                                                ロールが所有するロールと同じ名前のスキーマ内に、自身が所有するオブジェクトしかない場合、CASCADEオプションを指定できます。この場合、DROP ROLE name CASCADEコマンドを実行できるのはスーパーユーザです。このコマンドを使用すると、指定したロールに加えて、ロールと同じ名前のスキーマ、スキーマ内のすべてのオブジェクトを削除できます。

                                                                                                                                パラメータ

                                                                                                                                name

                                                                                                                                    削除対象のロールの名前です。

                                                                                                                                CASCADE

                                                                                                                                    指定した場合、ロールが所有するロールと同じ名前のスキーマも削除します。(そのスキーマ内の自身が所有するオブジェクトもすべて削除します。)指定できるのは、ロールもしくはスキーマに他の依存関係がない場合のみです。

                                                                                                                                ロールを削除します。

                                                                                                                                  DROP ROLE admins;

                                                                                                                                  関連項目

                                                                                                                                  ALTER ROLE, CREATE ROLE, SET ROLE

                                                                                                                                  3.3.35 DROP SEQUENCE

                                                                                                                                  名前

                                                                                                                                  DROP SEQUENCE -- シーケンスを削除する

                                                                                                                                  概要

                                                                                                                                  DROP SEQUENCE name [, ...]

                                                                                                                                  説明

                                                                                                                                  DROP SEQUENCEはシーケンス番号ジェネレータを削除します。このコマンドを実行できるのは、スーパーユーザまたはそのシーケンスの所有者です。

                                                                                                                                  パラメータ

                                                                                                                                  name

                                                                                                                                      シーケンスの名前です(スキーマ修飾名も可)。

                                                                                                                                  serialという名前のシーケンスを削除します。

                                                                                                                                    DROP SEQUENCE serial;

                                                                                                                                    関連項目

                                                                                                                                    ALTER SEQUENCE, CREATE SEQUENCE

                                                                                                                                    3.3.36 DROP TABLE

                                                                                                                                    名前

                                                                                                                                    DROP TABLE -- テーブルを削除する

                                                                                                                                    概要

                                                                                                                                    DROP TABLE name

                                                                                                                                    説明

                                                                                                                                    DROP TABLEはデータベースからテーブルを削除します。テーブルを削除できるのは、その所有者のみです。テーブルを削除するのではなく、テーブルの行を空にするには、DELETEを使用してください。

                                                                                                                                    DROP TABLEは、削除対象のテーブル内に存在するインデックス、ルール、トリガ、制約を全て削除します。

                                                                                                                                    パラメータ

                                                                                                                                    name

                                                                                                                                        削除するテーブルの名前です(スキーマ修飾名も可)。

                                                                                                                                    empテーブルを削除します。

                                                                                                                                      DROP TABLE emp;

                                                                                                                                      関連項目

                                                                                                                                      ALTER TABLE, CREATE TABLE

                                                                                                                                      3.3.37 DROP TABLESPACE

                                                                                                                                      名前

                                                                                                                                      DROP TABLESPACE -- テーブル空間を削除する

                                                                                                                                      概要

                                                                                                                                      DROP TABLESPACE tablespacename

                                                                                                                                      説明

                                                                                                                                      DROP TABLESPACEはシステムからテーブル空間を削除します。

                                                                                                                                      テーブル空間を削除できるのは、その所有者もしくはスーパーユーザのみです。テーブル空間を削除する前に、全てのデータベースオブジェクトが空になっていなければなりません。現在のデータベース内のオブジェクトが使用していなかったとしても、他のデータベース内のオブジェクトがそのテーブル空間上にあることがあります。

                                                                                                                                      パラメータ

                                                                                                                                      tablespacename

                                                                                                                                          テーブル空間の名前です。

                                                                                                                                      employee_spaceテーブル空間をシステムから削除します。

                                                                                                                                        DROP TABLESPACE employee_space;

                                                                                                                                        関連項目

                                                                                                                                        ALTER TABLESPACE

                                                                                                                                        3.3.38 DROP TRIGGER

                                                                                                                                        名前

                                                                                                                                        DROP TRIGGER -- トリガを削除する

                                                                                                                                        概要

                                                                                                                                        DROP TRIGGER name

                                                                                                                                        説明

                                                                                                                                        DROP TRIGGERはトリガの関係するテーブルから既存のトリガ定義を削除します。このコマンドを実行できるのは、スーパーユーザまたはトリガが定義されたテーブルの所有者のみです。

                                                                                                                                        パラメータ

                                                                                                                                        name

                                                                                                                                            削除するトリガの名前です。

                                                                                                                                        emp_sal_trigトリガを削除します。

                                                                                                                                          DROP TRIGGER emp_sal_trig;

                                                                                                                                          関連項目

                                                                                                                                          CREATE TRIGGER

                                                                                                                                          3.3.39 DROP USER

                                                                                                                                          名前

                                                                                                                                          DROP USER -- データベースユーザアカウントを削除する

                                                                                                                                          概要

                                                                                                                                          DROP USER name [ CASCADE ]

                                                                                                                                          説明

                                                                                                                                          DROP USERは指定したユーザを削除します。スーパーユーザを削除するには、自身もスーパーユーザでなければなりません。スーパーユーザ以外を削除するには、CREATEROLE権限を持たなければなりません。

                                                                                                                                          データベースクラスタのいずれかから参照されている場合、ユーザを削除することができません。削除しようとしてもエラーとなります。ユーザを削除する前に、そのユーザが所有するオブジェクトすべてを削除(またはその所有権を変更)しなければなりません。また、そのユーザが付与した権限も取り上げなければなりません。

                                                                                                                                          しかし、ユーザの持つロールメンバ資格を削除する必要はありません。DROP USERは自動的に他のロール内にある対象ユーザと対象ユーザ内にある他のロールのメンバ資格を取り上げます。他のロールは削除されることも何らかの影響を受けることもありません。

                                                                                                                                          ユーザが所有するユーザと同じ名前のスキーマ内に、自身が所有するオブジェクトしかない場合、CASCADEオプションを指定できます。この場合、DROP USER name CASCADEコマンドを実行できるのはスーパーユーザです。このコマンドを使用すると、指定したユーザに加えて、ユーザと同じ名前のスキーマ、スキーマ内のすべてのオブジェクトを削除できます。

                                                                                                                                          パラメータ

                                                                                                                                          name

                                                                                                                                              削除対象のユーザの名前です。

                                                                                                                                          CASCADE

                                                                                                                                              指定した場合、ユーザが所有するユーザと同じ名前のスキーマも削除します。(そのスキーマ内の自身が所有するオブジェクトもすべて削除します。)指定できるのは、ユーザもしくはスキーマに他の依存関係がない場合のみです。

                                                                                                                                          オブジェクトを所有しておらず、他のオブジェクトへの権限も付与されていないユーザアカウントを削除します。

                                                                                                                                            DROP USER john;

                                                                                                                                            johnという名前のユーザアカウントを削除します。このユーザは自身の所有するjohnスキーマの外部のオブジェクトへ権限が付与されておらず、外部にオブジェクトを所有していません。

                                                                                                                                              DROP USER john CASCADE;

                                                                                                                                              関連項目

                                                                                                                                              ALTER USER, CREATE USER

                                                                                                                                              3.3.40 DROP VIEW

                                                                                                                                              名前

                                                                                                                                              DROP VIEW -- ビューを削除する

                                                                                                                                              概要

                                                                                                                                              DROP VIEW name

                                                                                                                                              説明

                                                                                                                                              DROP VIEWは既存のビューを削除します。このコマンドを実行できるのは、ビューの所有者のみです。他のオブジェクトが指定したビューに依存している場合(ビューに対するビューのような場合)、ビューは削除されません。

                                                                                                                                              パラメータ

                                                                                                                                              name

                                                                                                                                                  削除するビューの名前です(スキーマ修飾名も可)。

                                                                                                                                              次のコマンドはdept_30という名前のビューを削除します。

                                                                                                                                                DROP VIEW dept_30;

                                                                                                                                                関連項目

                                                                                                                                                CREATE VIEW

                                                                                                                                                3.3.41 GRANT

                                                                                                                                                名前

                                                                                                                                                GRANT -- アクセス権限を定義する

                                                                                                                                                概要

                                                                                                                                                GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }
                                                                                                                                                  [,...] | ALL [ PRIVILEGES ] }
                                                                                                                                                  ON tablename
                                                                                                                                                  TO { username | groupname | PUBLIC } [, ...]
                                                                                                                                                  [ WITH GRANT OPTION ]
                                                                                                                                                
                                                                                                                                                GRANT { SELECT | ALL [ PRIVILEGES ] }
                                                                                                                                                  ON sequencename
                                                                                                                                                  TO { username | groupname | PUBLIC } [, ...]
                                                                                                                                                  [ WITH GRANT OPTION ]
                                                                                                                                                
                                                                                                                                                GRANT { EXECUTE | ALL [ PRIVILEGES ] }
                                                                                                                                                  ON FUNCTION progname 
                                                                                                                                                    ( [ [ argmode ] [ argname ] argtype ] [, ...] )
                                                                                                                                                  TO { username | groupname | PUBLIC } [, ...]
                                                                                                                                                  [ WITH GRANT OPTION ]
                                                                                                                                                
                                                                                                                                                GRANT { EXECUTE | ALL [ PRIVILEGES ] }
                                                                                                                                                  ON PROCEDURE progname 
                                                                                                                                                    [ ( [ [ argmode ] [ argname ] argtype ] [, ...] ) ]
                                                                                                                                                  TO { username | groupname | PUBLIC } [, ...]
                                                                                                                                                  [ WITH GRANT OPTION ]
                                                                                                                                                
                                                                                                                                                GRANT { EXECUTE | ALL [ PRIVILEGES ] }
                                                                                                                                                  ON PACKAGE packagename
                                                                                                                                                  TO { username | groupname | PUBLIC } [, ...]
                                                                                                                                                  [ WITH GRANT OPTION ]
                                                                                                                                                
                                                                                                                                                GRANT role [, ...]
                                                                                                                                                  TO { username | groupname | PUBLIC } [, ...]
                                                                                                                                                  [ WITH ADMIN OPTION ]
                                                                                                                                                
                                                                                                                                                GRANT { CONNECT | RESOURCE | DBA } [, ...]
                                                                                                                                                  TO { username | groupname } [, ...]
                                                                                                                                                  [ WITH ADMIN OPTION ]

                                                                                                                                                説明

                                                                                                                                                GRANTには基本的に2つの種類があります。1つはデータベースオブジェクト(テーブル、ビュー、シーケンス、プログラム)に対する権限の付与、もう1つはロール内のメンバ資格の付与です。これらは多くの点で似ていますが、説明は別々に行なわなければならない程違いもあります。

                                                                                                                                                Postgres Plusでは、ユーザとグループといった概念はロールと呼ばれる単一種類の実体に統合されました。ユーザはLOGIN属性を持つロールのことです。このロールはセッションを作成したり、アプリケーションへ接続するために使用されます。グループはLOGIN属性を持たないロールのことです。こちらは、セッションの作成やアプリケーションへの接続には使用されません。

                                                                                                                                                ロールは他の複数のロールのメンバになることができます。その意味では、グループに属するユーザという昔からの概念は現在でも有効です。しかし、現在はユーザとグループの区別がなくなり、ユーザに属するユーザ、グループに属するグループ、ユーザに属するグループというふうに一般化された多段階層をロールは形成可能です。また、ユーザ名とグループ名は同じ名前空間で共有されます。したがって、GRANTコマンドはユーザとグループを区別する必要はありません。

                                                                                                                                                3.3.41.1 データベースオブジェクトに対するGRANT

                                                                                                                                                この種類のGRANTコマンドはデータベースオブジェクトの特定の権限をロールに付与します。既に権限が他のロールに付与されている場合でも、追加として付与されます。

                                                                                                                                                PUBLICキーワードは、今後作成されるロールを含む、全てのロールへの許可を示します。PUBLICは、全てのロールを常に含む、暗黙的に定義されたグループと考えることができます。個々のロールは全て、ロールに直接許可された権限、ロールが現在属しているロールに許可された権限、そして、PUBLICに許可された権限を合わせた権限を持っています。

                                                                                                                                                WITH GRANT OPTIONが指定されると、権限の受領者は、その後、他にその権限を与えることができます。グラントオプションがない場合、受領者はこれを行うことができません。グラントオプションはPUBLICには与えることができません。

                                                                                                                                                オブジェクトの所有者(通常はオブジェクトを作成したユーザ)はデフォルトで全ての権限を保持しているため、所有者に権限を許可する必要はありません(ただし、オブジェクトの所有者が、安全性を確保するために自らの権限を取り消すことは可能です)。オブジェクトを削除する権限や何らかの方法でオブジェクトの定義を変更する権限は、付与可能な権限として記述することができません。これらの権限は、所有者固有のものであり、許可したり取り消したりすることはできません。所有者は、オブジェクトに対する全てのグラントオプションも暗黙的に保持しています。

                                                                                                                                                オブジェクトの種類によっては、デフォルト権限として、最初からいくつかの権限がPUBLICに付与されていることがあります。デフォルトではテーブルへのアクセスはできません。また、関数、プロシージャ、パッケージにはデフォルト権限として、EXECUTE権限が付与されています。もちろんオブジェクトの所有者はこれらの権限を取り消すことができます(最大限の安全性を得るため、REVOKEコマンドはオブジェクトを作成したトランザクションと同じトランザクション内で発行してください。そうすれば、他のユーザがそのオブジェクトを使用する時間はなくなります)。

                                                                                                                                                設定可能な権限は以下のものです。

                                                                                                                                                SELECT

                                                                                                                                                    指定したテーブル、ビュー、シーケンスの任意の列に対するSELECTを許可します。シーケンスでは、この権限によってcurrval関数を使用することができます。

                                                                                                                                                INSERT

                                                                                                                                                    指定したテーブルへの新規行のINSERTを許可します。

                                                                                                                                                UPDATE

                                                                                                                                                    指定したテーブルの任意の列に対するUPDATEを許可します。SELECT ... FOR UPDATEも(SELECT権限の他に)この権限を必要とします。

                                                                                                                                                DELETE

                                                                                                                                                    指定したテーブルからの行のDELETEを許可します。

                                                                                                                                                REFERENCES

                                                                                                                                                    外部キー制約を作成するには、参照する側と参照される側の両方のテーブルに対して、この権限を持っていなければなりません。

                                                                                                                                                EXECUTE

                                                                                                                                                    指定したパッケージ、プロシージャ、関数の使用を許可します。パッケージに対して適用した場合、パッケージに含まれるすべてのパブリック・プロシージャ、パブリック関数、パブリック変数、レコード、カーソル、およびその他のパブリック・オブジェクトやオブジェクト型の使用を許可します。EXECUTEは関数、プロシージャ、パッケージに適用できる唯一の権限です。

                                                                                                                                                    Postgres PlusでEXECUTE権限を付与する構文は、完全にはOracle互換ではありません。Postgres PlusではFUNCTIONPROCEDUREPACKAGEのいずれかをプログラム名の前に付ける必要があります。一方、Oracleではこれらは省略されなければいけません。さらに、Postgres Plusでは関数名の後に完全なシグネチャ(関数が引数を持たない場合の空の括弧も含む)を付ける必要があります。プロシージャにおいては1つ以上引数を持つ場合、完全なシグネチャが必要です。Oracleでは関数とプロシージャのシグネチャは省略されなければいけません。これはOracleではすべてのプログラムで同じ名前空間が共有されるためです。一方、Postgres Plusではプログラム名のオーバーロードが認められているので、関数、プロシージャ、パッケージが個々に名前空間を持ちます。

                                                                                                                                                ALL PRIVILEGES

                                                                                                                                                    利用可能な全ての権限を一度に付与します。

                                                                                                                                                その他のコマンドの実行に必要な権限は、そのコマンドのリファレンスページにて示されています。

                                                                                                                                                3.3.41.2 ロールに対するGRANT

                                                                                                                                                この種類のGRANTコマンドは、1つ以上のロール内のメンバ資格を付与します。これによりロールに付与された権限を各メンバに伝えますので、ロール内のメンバ資格は重要です。

                                                                                                                                                WITH ADMIN OPTIONが指定された場合、メンバはロール内のメンバ資格を他に付与することができるようになります。また同様にロール内のメンバ資格を取り上げることもできるようになります。アドミンオプションがないと、一般ユーザは他への権限の付与や取り上げを行うことができません。しかし、データベーススーパーユーザはすべてのロール内のメンバ資格を誰にでも付与したり、削除したりすることができます。CREATEROLE権限を持つロールは、スーパーユーザロール以外のロール内のメンバ資格の付与、取り上げが可能です。

                                                                                                                                                設定可能なロールは以下のものです。

                                                                                                                                                CONNECT

                                                                                                                                                    CONNECTロールを付与することはLOGIN権限を付与することと等価です。付与者はCREATEROLE権限を持っている必要があります。

                                                                                                                                                RESOURCE

                                                                                                                                                    RESOURCEロールを付与することは、受領者と同じ名前のスキーマに対してCREATE権限とUSAGE権限を付与することと等価です。このスキーマはコマンド実行前に存在していなければいけません。付与者はCREATE権限とUSAGE権限を付与できる権限を持っている必要があります。

                                                                                                                                                DBA

                                                                                                                                                    DBAロールを付与することは、受領者をスーパーユーザにすることと等価です。付与者はスーパーユーザでなければいけません。

                                                                                                                                                注釈

                                                                                                                                                アクセス権限を取り消すには、REVOKEコマンドが使用されます。

                                                                                                                                                オブジェクトの所有者でもなく、そのオブジェクトに何の権限も持たないユーザが、そのオブジェクトの権限をGRANTしようとしても、コマンドの実行は直ちに失敗します。何らかの権限を持っている限り、コマンドの実行は進行しますが、与えることのできる権限は、そのユーザがグラントオプションを持つ権限のみです。グラントオプションを持っていない場合、GRANT ALL PRIVILEGES構文は警告メッセージを発します。一方、その他の構文では、コマンドで名前を指定した権限に関するグラントオプションを持っていない場合に警告メッセージを発します(原理上、ここまでの説明はオブジェクトの所有者に対しても当てはまりますが、所有者は常に全てのグラントオプションを保持しているものとして扱われるため、こうした状態は決して起こりません)。

                                                                                                                                                データベーススーパーユーザのみが、オブジェクトに関する権限設定に関係なく、全てのオブジェクトにアクセスできることには注意しなければなりません。スーパーユーザが持つ権限は、Unixシステムにおけるroot権限に似ています。rootと同様、絶対に必要な場合以外は、スーパーユーザとして操作を行わないのが賢明です。

                                                                                                                                                スーパーユーザがGRANTREVOKEの発行を選択した場合、それらのコマンドは対象とするオブジェクトの所有者が発行したかのように実行されます。特に、こうしたコマンドで与えられる権限は、オブジェクトの所有者によって与えられたものとして表されます。(ロールのメンバ資格では、メンバ資格は含まれるロール自身が与えたものとして表されます。)

                                                                                                                                                GRANTおよびREVOKEは、影響するオブジェクトの所有者以外のロールによって実行することもできますが、オブジェクトを所有するロールのメンバであるか、そのオブジェクトに対しWITH GRANT OPTION権限を持つロールのメンバでなければなりません。この場合、その権限は、そのオブジェクトの実際の所有者ロールまたはWITH GRANT OPTION権限を持つロールによって付与されたものとして記録されます。例えば、t1テーブルがg1ロールによって所有され、u1g1ロールのメンバであるとします。この場合、u1t1上の権限をu2に付与できます。しかし、これらの権限はg1によって直接付与されたものとして現れます。後でg1ロールの他のメンバがこの権限を取り上げることができます。

                                                                                                                                                GRANTを実行したロールが、ロールの持つ複数メンバ資格の経路を通して間接的に必要な権限を持つ場合、どのロールが権限を付与したロールとして記録されるかについては指定されません。こうした場合、SET ROLEを使用して、GRANTを行わせたい特定のロールになることを推奨します。

                                                                                                                                                現時点ではPostgres Plusは、テーブルの個々の列に対して権限を付与したり取り消したりすることができません。これを回避するには、対象とする列を持つビューを作成し、そのビューに対して権限を付与します。

                                                                                                                                                empテーブルにデータを追加する権限を全てのユーザに与えます。

                                                                                                                                                  GRANT INSERT ON emp TO PUBLIC;

                                                                                                                                                  salesempビューにおける利用可能な全ての権限を、maryユーザに与えます。

                                                                                                                                                    GRANT ALL PRIVILEGES ON salesemp TO mary;

                                                                                                                                                    上のコマンドをスーパーユーザやempの所有者が実行した場合は、全ての権限が付与されますが、他のユーザが実行した場合は、そのユーザがグラントオプションを持つ権限のみが付与されることに注意してください。

                                                                                                                                                    adminsロール内のメンバ資格をjoeユーザに与えます。

                                                                                                                                                      GRANT admins TO joe;

                                                                                                                                                      CONNECT権限をjoeユーザに与えます。

                                                                                                                                                        GRANT CONNECT TO joe;

                                                                                                                                                        関連項目

                                                                                                                                                        REVOKE, SET ROLE

                                                                                                                                                        3.3.42 INSERT

                                                                                                                                                        名前

                                                                                                                                                        INSERT -- テーブルに新しい行を作成する

                                                                                                                                                        概要

                                                                                                                                                        INSERT INTO table[@dblink ] [ ( column [, ...] ) ]
                                                                                                                                                          { VALUES ( { expression | DEFAULT } [, ...] )
                                                                                                                                                            [ RETURNING return_expression [, ...]
                                                                                                                                                                { INTO { record | variable [, ...] }
                                                                                                                                                                | BULK COLLECT INTO collection [, ...] } ]
                                                                                                                                                          | query }

                                                                                                                                                        説明

                                                                                                                                                        INSERTはテーブルに新しい行を挿入します。単一の行を挿入するだけでなく、問い合わせの結果を使って0行以上の行を挿入することもできます。

                                                                                                                                                        データを挿入する列はどんな順番に並んでいても構いません。テーブル内の列でデータが挿入されない列には、指定されたデフォルト値もしくはnullが挿入されます。

                                                                                                                                                        各列の式が正しいデータ型でない場合は、自動的に型の変換が行われます。

                                                                                                                                                        INSERTコマンドがSPLプログラム内でVALUES句と併せて使用される場合のみ、RETURNING INTO { record | variable [, ...] }句を指定できます。

                                                                                                                                                        INSERTコマンドがSPLプログラム内で使用される場合のみ、RETURNING BULK COLLECT INTO collection [, ...]句を指定できます。BULK COLLECT INTO句の対象として複数のcollectionが指定された場合、各collectionは単一のスカラーフィールドでなければいけません。つまり、collectionはレコードではいけません。挿入された各行に対して評価されるreturn_expressioncollectionの要素になります。collection内の既存の行は削除されます。結果が空の場合、collectionは空になります。

                                                                                                                                                        テーブルに行を追加するには、そのテーブルに対してINSERT権限を持っている必要があります。queryを使用して問い合わせ結果を元に行を挿入する場合は、その問い合わせ内で使われる全てのテーブルに対してSELECT権限を持っている必要があります。

                                                                                                                                                        パラメータ

                                                                                                                                                        table

                                                                                                                                                            既存のテーブルの名前です(スキーマ修飾名も可)。

                                                                                                                                                        dblink

                                                                                                                                                            リモートのデータベースを識別するデータベースリンクの名前です。データベースリンクに関する詳細は、CREATE DATABASE LINKコマンドを参照してください。

                                                                                                                                                        column

                                                                                                                                                            table内の列名です。

                                                                                                                                                        expression

                                                                                                                                                            対応するcolumnに代入する有効な式または値を指定します。

                                                                                                                                                        DEFAULT

                                                                                                                                                            対応するcolumnにデフォルト値を設定します。

                                                                                                                                                        query

                                                                                                                                                            挿入する行を提供する問い合わせ(SELECT文)を指定します。構文の説明についてはSELECTを参照してください。

                                                                                                                                                        return_expression

                                                                                                                                                            tableの1つ以上の列を含む式です。return_expressiontableの列名が指定された場合、return_expressionの評価後に列に代入される値は以下のように決定されます。

                                                                                                                                                              return_expressionで指定した列にINSERTコマンド内で値が割り当てられている場合、return_expressionの評価時にその値が使用されます。

                                                                                                                                                              return_expressionで指定した列にINSERTコマンド内で値が割り当てられておらず、テーブルの列定義でもデフォルト値が指定されていない場合、return_expressionの評価時にnullが使用されます。

                                                                                                                                                              return_expressionで指定した列にINSERTコマンド内では値が割り当てられていないが、テーブルの列定義でデフォルト値が指定されている場合、return_expressionの評価時にデフォルト値が使用されます。

                                                                                                                                                        record

                                                                                                                                                            return_expressionで評価された結果が割り当てられるレコードです。return_expressionでの最初の結果がrecord内の最初の項目に割り当てられます。2番目の結果が2番目の項目に割り当てられます。以下、同様です。record内の項目数は式の数と同じでなければいけません。また、項目は対応する式と型に互換性がなければいけません。

                                                                                                                                                        variable

                                                                                                                                                            return_expressionで評価された結果が割り当てられる変数です。1つ以上のreturn_expressionvariableが指定された場合、return_expressionでの最初の結果が最初のvariableに割り当てられます。2番目の結果が2番目のvariableに割り当てられます。以下、同様です。INTOに続いて指定される変数の数は、RETURNINGに続いて指定される式の数と同じでなければいけません。また、変数は対応する式と型に互換性がなければいけません。

                                                                                                                                                        collection

                                                                                                                                                            return_expressionで評価された結果から作成される要素の集合です。単一の集合、つまり単一フィールドの集合かもしれませんし、レコード型の集合かもしれません。もしくは、各集合が単一フィールドからなる複数の集合かもしれません。式の数は、すべての指定した集合のフィールド数と同じでなければいけません。また、対応するreturn_expressioncollectionフィールドは型に互換性がなければいけません。

                                                                                                                                                        empテーブルに1行を挿入します。

                                                                                                                                                          INSERT INTO emp VALUES (8021,'JOHN','SALESMAN',7698,'22-FEB-07',1250,500,30);

                                                                                                                                                          この例では、comm列を省略しています。 したがって、ここにはデフォルト値nullが入ります。

                                                                                                                                                            INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, deptno)  
                                                                                                                                                                VALUES (8022,'PETERS','CLERK',7698,'03-DEC-06',950,30);

                                                                                                                                                            この例では、hiredate列とcomm列に値を指定するのではなく、DEFAULT句を使用しています。

                                                                                                                                                              INSERT INTO emp VALUES (8023,'FORD','ANALYST',7566,DEFAULT,3000,DEFAULT,20);

                                                                                                                                                              この例では、deptnamesテーブルを作成し、deptテーブルのdname列から選択した結果を挿入します。

                                                                                                                                                                CREATE TABLE deptnames (  
                                                                                                                                                                    deptname        VARCHAR2(14)  
                                                                                                                                                                );  
                                                                                                                                                                INSERT INTO deptnames SELECT dname FROM dept;

                                                                                                                                                                3.3.43 LOCK

                                                                                                                                                                名前

                                                                                                                                                                LOCK -- テーブルをロックする

                                                                                                                                                                概要

                                                                                                                                                                LOCK TABLE name [, ...] IN lockmode MODE [ NOWAIT ]

                                                                                                                                                                lockmodeには以下のいずれかが入ります。

                                                                                                                                                                ROW SHARE | ROW EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE

                                                                                                                                                                説明

                                                                                                                                                                LOCK TABLEはテーブルレベルのロックを取得します。必要であれば競合するロックが解除されるまで待機します。NOWAITが指定された場合は、LOCK TABLE対象のロックを取得できなくても待機しません。この場合、すぐにロックが取得できなければ、このコマンドを中止し、エラーを出力します。ロックは、一度取得されると現行のトランザクションが完了するまで保持されます(UNLOCK TABLEといったコマンドはありません。ロックが解除されるのは常にトランザクションの終了時です)。

                                                                                                                                                                テーブルを参照するコマンドのために自動的にロックを取得する場合、Postgres Plusは常に使用可能な一番弱いロックモードを使用します。LOCK TABLEはより制限の強いロックが必要な場合のために用意されています。例えば、隔離レベルread committedでトランザクションを実行するアプリケーションで、トランザクションの間中、テーブルのデータを確実に安定させる必要がある場合を考えます。この場合、問い合わせ実行前にテーブル全体にSHAREロックモードを使用します。これにより、データが同時に変更されるのを防ぎ、それ以降のテーブルの読み取りを安定させることができます。なぜならSHAREロックモードは書き込み側が取得するROW EXCLUSIVEロックと競合するので、LOCK TABLE name IN SHARE MODE文は、ROW EXCLUSIVEを保持しているトランザクションがコミットまたはロールバックされるのを待つからです。 したがって、一度ロックを取得してしまえば、コミットされていない状態の書き込みは存在しないことになります。さらに、ロックを解除するまで他のアプリケーションは書き込みを開始することができません。

                                                                                                                                                                シリアライザブル隔離レベルで実行しているトランザクションで同様の効果を得るには、全てのデータを更新する文を実行する前にLOCK TABLE文を実行する必要があります。シリアライザブルなトランザクション側から参照するデータの状態は、最初にデータ更新用文が開始された時点で固定されます。後からトランザクション内でLOCK TABLEを実行した場合も同時書き込みを防ぐことはできますが、トランザクションの読み込み対象データの値がコミットされた最新の値であることは保証されません。

                                                                                                                                                                このようなトランザクションでテーブル内データを変更する場合は、SHAREモードではなくSHARE ROW EXCLUSIVEロックモードを使用する必要があります。

                                                                                                                                                                これによって、この種のトランザクションが同時に複数実行されることがなくなります。SHARE ROW EXCLUSIVEを使用しないと、デッドロックが発生する可能性があります。2つのトランザクションの両方が、SHAREモードを取得していながら、実際の更新に必要なROW EXCLUSIVEモードを取得できない状態になる可能性があるためです(トランザクション自身が所有しているロック間は競合しないので、トランザクションはSHAREモードを保持している間もROW EXCLUSIVEを獲得することができます。しかし、他のトランザクションがSHAREモードを保持している時にはROW EXCLUSIVEを獲得することはできません)。デッドロックを回避するには、全てのトランザクションが、必ず同一オブジェクトに対して同一の順番でロックを取得するようにしてください。また、1つのオブジェクトに対して複数のロックモードを呼び出す場合、トランザクションは常に最も制限の強いモードを最初に取得しなければなりません。

                                                                                                                                                                パラメータ

                                                                                                                                                                name

                                                                                                                                                                    ロックする既存のテーブルの名前です(スキーマ修飾名も可)。

                                                                                                                                                                    LOCK TABLE a, b; というコマンドはLOCK TABLE a; LOCK TABLE bと同じです。テーブルは1つひとつLOCK TABLEコマンドで指定された順番でロックされます。

                                                                                                                                                                lockmode

                                                                                                                                                                    ロックモードには、取得するロックと競合するロックを指定します。

                                                                                                                                                                    ロックモードを指定しない場合、最も制限が強いACCESS EXCLUSIVEが使用されます。(ACCESS EXCLUSIVEOracle互換ではありません。Postgres Plusにおいて、このモードでは他のトランザクションはどんな方法でもロックされたテーブルにアクセスできません。)

                                                                                                                                                                NOWAIT

                                                                                                                                                                    LOCK TABLEが競合するロックの解放まで待機しないことを指定します。指定したロックがすぐに取得できない場合、トランザクションはアボートされます。

                                                                                                                                                                注釈

                                                                                                                                                                すべての形式のLOCKには、UPDATEまたはDELETE、あるいはその両方の権限が必要です。

                                                                                                                                                                LOCK TABLEはトランザクションブロック内部でのみ有効です。したがって、トランザクションが終了するとロックも削除されます。トランザクションブロックの外部でLOCK TABLEコマンドを実行すると、そのコマンドのみを含むトランザクションが形成されるので、このロックは取得後すぐに削除されます。

                                                                                                                                                                LOCK TABLEが扱うのはテーブルレベルのロックのみです。そのため、モード名にROWが含まれるのは適切ではありません。これらのモード名によって、普通は、ロックされたテーブル内で行レベルのロックを取得できると思ってしまうでしょう。また、ROW EXCLUSIVEモードは共有可能なロックです。LOCK TABLEに関しては、全てのロックモードが同じ意味を持っていることに注意してください。違うのは、どのモードがどのモードと競合するかという規則だけです。

                                                                                                                                                                3.3.44 REVOKE

                                                                                                                                                                名前

                                                                                                                                                                REVOKE -- アクセス権限を取り消す

                                                                                                                                                                概要

                                                                                                                                                                REVOKE { { SELECT | INSERT | UPDATE | DELETE | REFERENCES }
                                                                                                                                                                  [,...] | ALL [ PRIVILEGES ] }
                                                                                                                                                                  ON tablename
                                                                                                                                                                  FROM { username | groupname | PUBLIC } [, ...]
                                                                                                                                                                  [ CASCADE | RESTRICT ]
                                                                                                                                                                
                                                                                                                                                                REVOKE { SELECT | ALL [ PRIVILEGES ] }
                                                                                                                                                                  ON sequencename
                                                                                                                                                                  FROM { username | groupname | PUBLIC } [, ...]
                                                                                                                                                                  [ CASCADE | RESTRICT ]
                                                                                                                                                                
                                                                                                                                                                REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
                                                                                                                                                                  ON FUNCTION progname
                                                                                                                                                                    ( [ [ argmode ] [ argname ] argtype ] [, ...] )
                                                                                                                                                                  FROM { username | groupname | PUBLIC } [, ...]
                                                                                                                                                                  [ CASCADE | RESTRICT ]
                                                                                                                                                                
                                                                                                                                                                REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
                                                                                                                                                                  ON PROCEDURE progname
                                                                                                                                                                    [ ( [ [ argmode ] [ argname ] argtype ] [, ...] ) ]
                                                                                                                                                                  FROM { username | groupname | PUBLIC } [, ...]
                                                                                                                                                                  [ CASCADE | RESTRICT ]
                                                                                                                                                                
                                                                                                                                                                REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
                                                                                                                                                                  ON PACKAGE packagename
                                                                                                                                                                  FROM { username | groupname | PUBLIC } [, ...]
                                                                                                                                                                  [ CASCADE | RESTRICT ]
                                                                                                                                                                
                                                                                                                                                                REVOKE role [, ...] FROM { username | groupname | PUBLIC }
                                                                                                                                                                  [, ...]
                                                                                                                                                                  [ CASCADE | RESTRICT ]
                                                                                                                                                                
                                                                                                                                                                REVOKE { CONNECT | RESOURCE | DBA } [, ...]
                                                                                                                                                                  FROM { username | groupname } [, ...]

                                                                                                                                                                説明

                                                                                                                                                                REVOKEコマンドは、1つ以上のロールに対して、以前に与えた権限を取り消します。PUBLICキーワードは暗黙的に定義された全ロールからなるグループです。

                                                                                                                                                                権限の種類の意味についてはGRANTコマンドの説明を参照してください。

                                                                                                                                                                全てのロールは、そのロールに直接許可された権限、現在属しているロールに許可された権限、PUBLICに許可された権限という3つの権限を合わせた権限を持っていることに注意してください。したがって、例えば、PUBLICからSELECT権限を取り消すことは、必ずしも全てのロールがそのオブジェクトに対するSELECT権限を失うことを意味しません。権限が直接許可されているロール、あるいは、別ロール経由で許可されているロールは、SELECT権限を持ち続けます。

                                                                                                                                                                権限がグラントオプション付きで付与されていた場合、権限だけでなくグラントオプションも取り消されます。

                                                                                                                                                                グラントオプション付きの権限を保持しているユーザが、その権限を他ユーザに与えていた場合、与えられたユーザが保持する権限は依存権限と呼ばれます。権限を与えたユーザ自身の権限やグラントオプションが取り消された時、その権限に依存権限が存在する場合、CASCADEが指定されていると依存権限も取り消されます。指定されていなければ、権限の取り消しが失敗します。この再帰的な権限の取り消しは、ユーザ権限の連鎖を通じて与えられた権限の中でも、REVOKEを実行されたユーザから追跡可能な範囲にのみ影響します。したがって、依存権限を持つユーザが他のユーザからも同じ権限を与えられている場合は、REVOKEが実行された後もその権限を保持している可能性があります。

                                                                                                                                                                注意: CASCADEOracle互換のオプションではありません。Oracleではデフォルトで依存権限を取り消します。しかし、Postgres Plusでは明確にCASCADEを指定する必要があります。指定しない場合、REVOKEコマンドは失敗します。

                                                                                                                                                                ロールのメンバ資格を取り消す場合、同様に振舞いますが、GRANT OPTIONではなくADMIN OPTIONが呼び出されます。

                                                                                                                                                                注釈

                                                                                                                                                                取り消すことができるのは、ユーザが直接付与した権限のみです。例えば、もし、ユーザAがグラントオプションを付けてユーザBに権限を与え、その後、ユーザBがユーザCにその権限を与えたとすると、ユーザAはユーザCの権限を直接取り消すことはできません。その代わり、ユーザAがユーザBのグラントオプションをCASCADEオプション付きで取り消すことで、ユーザCに与えられた権限を取り消すことができます。別の状況を考えてみます。ABの両方が同じ権限をCに与えた場合、AAの与えた権限を取り消すことはできますが、Bの与えた権限を取り消すことはできません。したがって、Cは実質的にその権限を持ち続けることになります。

                                                                                                                                                                オブジェクトの所有者以外がそのオブジェクト上の権限に対してREVOKEを実行した場合、ユーザがオブジェクトに対して何の権限も持っていなければ、即座にコマンドが失敗します。何らかの権限があればコマンド処理が続行されますが、取り消すことができるのはそのユーザがグラントオプションを持つ権限のみです。REVOKE ALL PRIVILEGES構文をまったく権限を持たない状態で実行すると、警告が出力されます。他の構文の場合は、そのコマンドで指名した権限に対するグラントオプションを持たない状態で実行すると、警告が出力されます(原理上、上記の説明はオブジェクト所有者にも適用されますが、所有者は常に全てのグラントオプションを保持しているので、こうした問題が発生することはありません)。

                                                                                                                                                                スーパーユーザがGRANTREVOKEコマンドを発行した場合、そのコマンドは、対象のオブジェクトの所有者によって発行されものであるかのように動作します。根本的には全ての権限はオブジェクトの所有者から渡されるものなので(ただし、グラントオプションの連鎖により間接的に渡される場合もありますが)、スーパーユーザは、全ての権限を取り消すことができます。ただし、この場合は上述のCASCADEを使用する必要があります。

                                                                                                                                                                REVOKEは、影響するオブジェクトの所有者以外のロールによって実行することもできますが、オブジェクトを所有するロールのメンバであるか、そのオブジェクトに対しWITH GRANT OPTION権限を持つロールのメンバでなければなりません。この場合、そのオブジェクトの実際の所有者ロールまたはWITH GRANT OPTION権限を持つロールによって発行されたかのように、このコマンドは実行されます。例えば、t1テーブルがg1ロールによって所有され、u1g1ロールのメンバであるとします。この場合、u1g1で付与されたものと記録されているt1上の権限を取り上げることができます。これには、u1が付与した権限とg1ロールの他のメンバによって付与された権限が含まれます。

                                                                                                                                                                REVOKEを実行したロールが、ロールの持つ複数メンバ資格の経路を通して間接的に必要な権限を持つ場合、どのロールが権限を付与したロールとして記録されるかについては指定されません。こうした場合、SET ROLEを使用して、REVOKEを行わせたい特定のロールになることを推奨します。そうしないと、意図しないロールによって権限を取り上げることになったり、取り上げ自体が失敗することになったりします。

                                                                                                                                                                publicに与えたempテーブルに対する挿入権限を取り消します。

                                                                                                                                                                  REVOKE INSERT ON emp FROM PUBLIC;

                                                                                                                                                                  salesempビューから、maryユーザに与えた全ての権限を取り上げます。

                                                                                                                                                                    REVOKE ALL PRIVILEGES ON salesemp FROM mary;

                                                                                                                                                                    これは"自分が与えた全ての権限を取り消す"ことを意味します。

                                                                                                                                                                    ユーザjoeからロールadmins内のメンバ資格を取り上げます。

                                                                                                                                                                      REVOKE admins FROM joe;

                                                                                                                                                                      ユーザjoeからCONNECT権限を取り上げます。

                                                                                                                                                                        REVOKE CONNECT FROM joe;

                                                                                                                                                                        関連項目

                                                                                                                                                                        GRANT, SET ROLE

                                                                                                                                                                        3.3.45 ROLLBACK

                                                                                                                                                                        名前

                                                                                                                                                                        ROLLBACK -- 現在のトランザクションをアボートする

                                                                                                                                                                        概要

                                                                                                                                                                        ROLLBACK [ WORK ]

                                                                                                                                                                        説明

                                                                                                                                                                        ROLLBACKは現在のトランザクションをロールバックし、そのトランザクションで行われた全ての更新を廃棄させます。

                                                                                                                                                                        パラメータ

                                                                                                                                                                        WORK

                                                                                                                                                                            省略可能なキーワードです。効果は何もありません。

                                                                                                                                                                        注釈

                                                                                                                                                                        トランザクションを正常に終了させるにはCOMMITを使用してください。

                                                                                                                                                                        トランザクションの外部でROLLBACKを発行しても問題はありません。

                                                                                                                                                                        ROLLBACKSPLプログラム内ではサポートされていません。

                                                                                                                                                                        全ての変更をアボートします。

                                                                                                                                                                          ROLLBACK;

                                                                                                                                                                          関連項目

                                                                                                                                                                          COMMIT, ROLLBACK TO SAVEPOINT, SAVEPOINT

                                                                                                                                                                          3.3.46 ROLLBACK TO SAVEPOINT

                                                                                                                                                                          名前

                                                                                                                                                                          ROLLBACK TO SAVEPOINT -- セーブポイントまでロールバックする

                                                                                                                                                                          概要

                                                                                                                                                                          ROLLBACK [ WORK ] TO [ SAVEPOINT ] savepoint_name

                                                                                                                                                                          説明

                                                                                                                                                                          セーブポイントの設定後に実行されたコマンドを全てロールバックします。セーブポイントは有効なまま残るので、必要に応じて、その後再度ロールバックすることができます。

                                                                                                                                                                          ROLLBACK TO SAVEPOINTは、指定したセーブポイントより後に設定した全てのセーブポイントを暗黙的に破棄します。

                                                                                                                                                                          パラメータ

                                                                                                                                                                          savepoint_name

                                                                                                                                                                              ロールバック先のセーブポイントです。

                                                                                                                                                                          注釈

                                                                                                                                                                          設定されていないセーブポイントの名前を指定するとエラーになります。

                                                                                                                                                                          ROLLBACK TO SAVEPOINTSPLプログラムでサポートされていません。

                                                                                                                                                                          deptsの設定後に実行されたコマンドの効果を取り消します。

                                                                                                                                                                            \set AUTOCOMMIT off  
                                                                                                                                                                            INSERT INTO dept VALUES (50, 'HR', 'NEW YORK');  
                                                                                                                                                                            SAVEPOINT depts;  
                                                                                                                                                                            INSERT INTO emp (empno, ename, deptno) VALUES (9001, 'JONES', 50);  
                                                                                                                                                                            INSERT INTO emp (empno, ename, deptno) VALUES (9002, 'ALICE', 50);  
                                                                                                                                                                            ROLLBACK TO SAVEPOINT depts;

                                                                                                                                                                            関連項目

                                                                                                                                                                            COMMIT, ROLLBACK, SAVEPOINT

                                                                                                                                                                            3.3.47 SAVEPOINT

                                                                                                                                                                            名前

                                                                                                                                                                            SAVEPOINT -- 現在のトランザクション内に新規にセーブポイントを定義する

                                                                                                                                                                            概要

                                                                                                                                                                            SAVEPOINT savepoint_name

                                                                                                                                                                            説明

                                                                                                                                                                            SAVEPOINTは、現在のトランザクション内に新しいセーブポイントを設定します。

                                                                                                                                                                            セーブポイントとはトランザクション内に付ける特別な印です。セーブポイントを設定しておくと、それ以降に実行されたコマンドを全てロールバックし、トランザクションを設定時の状態に戻すことができます。

                                                                                                                                                                            パラメータ

                                                                                                                                                                            savepoint_name

                                                                                                                                                                                新しいセーブポイントに付与する名前です。

                                                                                                                                                                            注釈

                                                                                                                                                                            セーブポイントまでロールバックするにはROLLBACK TO SAVEPOINTを使用してください。

                                                                                                                                                                            セーブポイントはトランザクションブロックの内側のみに設定することができます。 1つのトランザクションの中には、複数のセーブポイントを設定することができます。

                                                                                                                                                                            すでに存在するセーブポイントと同じ名前のセーブポイントが設定された時は、古いセーブポイントも保持されます。しかし、ロールバック時には新しい方のセーブポイントが使用されます。

                                                                                                                                                                            セーブポイントを設定し、その後に実行した全てのコマンドの効果を取り消します。

                                                                                                                                                                              \set AUTOCOMMIT off  
                                                                                                                                                                              INSERT INTO dept VALUES (50, 'HR', 'NEW YORK');  
                                                                                                                                                                              SAVEPOINT depts;  
                                                                                                                                                                              INSERT INTO emp (empno, ename, deptno) VALUES (9001, 'JONES', 50);  
                                                                                                                                                                              INSERT INTO emp (empno, ename, deptno) VALUES (9002, 'ALICE', 50);  
                                                                                                                                                                              SAVEPOINT emps;  
                                                                                                                                                                              INSERT INTO jobhist VALUES (9001,'17-SEP-07',NULL,'CLERK',800,NULL,50,'New Hire');  
                                                                                                                                                                              INSERT INTO jobhist VALUES (9002,'20-SEP-07',NULL,'CLERK',700,NULL,50,'New Hire');  
                                                                                                                                                                              ROLLBACK TO depts;  
                                                                                                                                                                              COMMIT;

                                                                                                                                                                              上記のトランザクションでは、deptテーブルへの挿入は実行されますが、empテーブルとjobhistテーブルへの挿入はロールバックされます。

                                                                                                                                                                              関連項目

                                                                                                                                                                              COMMIT, ROLLBACK, ROLLBACK TO SAVEPOINT

                                                                                                                                                                              3.3.48 SELECT

                                                                                                                                                                              名前

                                                                                                                                                                              SELECT -- テーブルもしくはビューから行を検索する

                                                                                                                                                                              概要

                                                                                                                                                                              SELECT [ optimizer_hint ] [ ALL | DISTINCT ]
                                                                                                                                                                                * | expression [ AS output_name ] [, ...]
                                                                                                                                                                                FROM from_item [, ...]
                                                                                                                                                                                [ WHERE condition ]
                                                                                                                                                                                [ [ START WITH start_expression ]
                                                                                                                                                                                    CONNECT BY { PRIOR parent_expr = child_expr |
                                                                                                                                                                                      child_expr = PRIOR parent_expr }
                                                                                                                                                                                  [ ORDER SIBLINGS BY expression [ ASC | DESC ] [, ...] ] ]
                                                                                                                                                                                [ GROUP BY expression [, ...] [ LEVEL ] ]
                                                                                                                                                                                [ HAVING condition [, ...] ]
                                                                                                                                                                                [ { UNION [ ALL ] | INTERSECT | MINUS } select ]
                                                                                                                                                                                [ ORDER BY expression [ ASC | DESC ] [, ...] ]
                                                                                                                                                                                [ FOR UPDATE ]

                                                                                                                                                                              ここでfrom_itemは以下のいずれかです。

                                                                                                                                                                                table_name[@dblink ] [ alias ]
                                                                                                                                                                                ( select ) alias
                                                                                                                                                                                from_item [ NATURAL ] join_type from_item
                                                                                                                                                                                  [ ON join_condition | USING ( join_column [, ...] ) ]

                                                                                                                                                                              説明

                                                                                                                                                                              SELECTは1個以上のテーブルから行を返します。SELECTの一般的な処理は以下の通りです。

                                                                                                                                                                                1. FROMリストにある全要素が計算されます(FROMリストの要素は実テーブルか仮想テーブルのいずれかです)。FROMリストに複数の要素が指定された場合、それらはクロス結合されます(後述のFROM句を参照してください)。

                                                                                                                                                                                2. WHERE句が指定された場合、条件を満たさない行は全て出力から取り除かれます(後述のWHERE句を参照してください)。

                                                                                                                                                                                3. GROUP BY句が指定された場合、1つまたは複数の値が条件に合う行ごとにグループに分けて出力されます。HAVING句が指定された場合、指定した条件を満たさないグループは取り除かれます(後述のGROUP BY句とHAVING句を参照してください)。

                                                                                                                                                                                4. UNIONINTERSECTMINUS演算子を使用すると、複数のSELECT文の出力を1つの結果集合にまとめることができます。UNION演算子は、両方の結果集合に存在する行と、片方の結果集合に存在する行を全て返します。INTERSECT演算子は、両方の結果集合に存在する行を返します。MINUS演算子は、最初の結果集合にあり、2番目の結果集合にない行を返します。いずれの場合も、重複する行は取り除かれます。UNION演算子でALLが指定された場合、重複する行は取り除かれません(後述のUNION句、INTERSECT句、MINUS句を参照してください)。

                                                                                                                                                                                5. 実際には、選択された各行に対して、SELECT出力式を使用して計算した結果の行が出力されます(後述のSELECTリストを参照してください)。

                                                                                                                                                                                6. CONNECT BY句が指定された場合、階層関係を持つデータを選択します。そのようなデータは行の間で親子関係を持ちます(後述のCONNECT BY句を参照してください)。

                                                                                                                                                                                7. ORDER BY句が指定された場合、返される行は指定した順番でソートされます。ORDER BYが指定されない場合は、システムが計算過程で見つけた順番で行が返されます(後述のORDER BY句を参照してください)。

                                                                                                                                                                                8. DISTINCTは結果から重複行を取り除きます。ALLでは、重複行も含め、全ての候補行を返します(これがデフォルトです。詳しくは、後述のDISTINCT句を参照してください)。

                                                                                                                                                                                9. FOR UPDATE句を指定すると、SELECT文は引き続き行われる更新に備えて選択行をロックします(後述のFOR UPDATE句を参照してください)。

                                                                                                                                                                              テーブルから値を読み取るにはSELECT権限が必要です。FOR UPDATEを使用するには、さらに、UPDATE権限が必要です。

                                                                                                                                                                              パラメータ

                                                                                                                                                                              optimizer_hint

                                                                                                                                                                                  オプティマイザが実行計画を選択する時に使用するコメント内に置かれるヒントです。オプティマイザ・ヒントに関する詳細は、第3.4章を参照してください。

                                                                                                                                                                              その他のパラメータは以下で説明します。

                                                                                                                                                                              3.3.48.1 FROM句

                                                                                                                                                                              FROM句にはSELECTの対象となるソーステーブルを1つ以上指定します。複数のソースが指定された場合、結果は全てのソースの直積(クロス結合)となります。しかし、通常は制約条件を付けて、直積のごく一部を返すように結果行を限定します。

                                                                                                                                                                              FROM句には以下の要素を指定できます。

                                                                                                                                                                              table_name[@dblink ]

                                                                                                                                                                                  既存のテーブルもしくはビューの名前です(スキーマ修飾名も可)。dblinkはリモートのデータベースを指定するためのデータベースリンク名です。データベースリンクの詳細はCREATE DATABASE LINKコマンドを参照してください。

                                                                                                                                                                              alias

                                                                                                                                                                                  別名を含むFROMアイテムの代替名です。別名は、指定を簡潔にするため、もしくは、自己結合(同じテーブルを複数回スキャンする結合)の曖昧さをなくすために使われます。別名が指定されている場合は、その別名によって実際のテーブル名または関数名が完全に隠されます。例えば、FROM foo AS fと指定されている場合、以降のSELECT文ではこのFROMアイテムをfooではなくfとして参照する必要があります。

                                                                                                                                                                              select

                                                                                                                                                                                  FROM句では、副SELECTを使うことができます。SELECTコマンドの実行中、副SELECTの出力は一時テーブルであるかのように動作します。副SELECTは括弧で囲まれなければなりません。また、必ず別名を与えておかなければなりません。

                                                                                                                                                                              join_type

                                                                                                                                                                                  以下のいずれかです。

                                                                                                                                                                              [ INNNER ] JOIN  
                                                                                                                                                                              LEFT [ OUTER ] JOIN  
                                                                                                                                                                              RIGHT [ OUTER ] JOIN  
                                                                                                                                                                              FULL [ OUTER ] JOIN  
                                                                                                                                                                              CROSS JOIN

                                                                                                                                                                                INNERおよびOUTER結合型では、結合条件、すなわち、NATURALON join_conditionUSING (join_column [, ...] )のいずれか1つのみを指定する必要があります。それぞれの意味は後述します。CROSS JOINでは、これらの句を記述しなくても構いません。

                                                                                                                                                                                JOIN句は、2つのFROMアイテムを結び付けます。入れ子の順番を決めるために、必要ならば括弧を使用してください。括弧がないと、JOINは左から右へ入れ子にします。どのような場合でもJOINは、カンマで分けられたFROMアイテムよりも強い結び付きを持ちます。

                                                                                                                                                                                CROSS JOININNER JOINは直積を1つ生成します。これは、FROMの最上位で2つの項目を結合した結果と同一です。しかし、(指定すれば)結合条件によって制限をかけることができます。CROSS JOININNER JOIN ON (TRUE) と等価であり、条件によって削除される行はありません。これらの結合型は記述上の便宜のためだけに用意されています。したがって、通常のFROMWHEREを実行しなければ何も行いません。

                                                                                                                                                                                LEFT OUTER JOINは、条件に合う直積の全ての行(つまり、その結合条件を満たす全ての組み合わせ)に加え、左側テーブルの中で、右側テーブルには結合条件を満たす行が存在しなかった行のコピーも返します。 この左側テーブルの行を結合結果のテーブルの幅に拡張するために、右側テーブルが入る列にはnull値が挿入されます。 マッチする行を決める時は、JOIN句自身の条件のみが考慮されることに注意してください。他の外部結合条件は後で適用されます。

                                                                                                                                                                                逆に、RIGHT OUTER JOINは、全ての結合行と、左側テーブルに当てはまるものがなかった右側の行(左側はnullで拡張されています)の1行ずつを返します。左右のテーブルを入れ替えればLEFT OUTER JOINに変換できるので、RIGHT OUTER JOINは記述上の便宜を図るため用意されているに過ぎません。

                                                                                                                                                                                FULL OUTER JOINは、全ての結合行に加え、一致しなかった左側の行(右側はnullで拡張)、一致しなかった右側の行(左側はnullで拡張)を全て返します。

                                                                                                                                                                              ON join_condition

                                                                                                                                                                                  join_conditionは、結合においてどの行が一致するかを指定する、BOOLEAN型の値を返す式です(WHERE句に類似しています)。

                                                                                                                                                                              USING (join_column [, ...] )

                                                                                                                                                                                  USING (a, b, ... ) 句はON left_table.a = right_table.a AND left_table.b = right_table.b .... の省略形です。USINGは等価な列の両方ではなく片方のみが結合の出力に含まれることを意味します。

                                                                                                                                                                              NATURAL

                                                                                                                                                                                  NATURALは、2つのテーブル内の同じ名前を持つ行を全て指定したUSINGリストの省略形です。

                                                                                                                                                                              3.3.48.2 WHERE句

                                                                                                                                                                              WHERE句は通常以下の形式となります(この句は省略可能です)。

                                                                                                                                                                                WHERE condition

                                                                                                                                                                                conditionは、評価の結果としてBOOLEAN型を返す任意の式です。この条件を満たさない行は全て出力から取り除かれます。全ての変数に実際の行の値を代入して、式が真を返す場合、その行は条件を満たすとみなされます。

                                                                                                                                                                                3.3.48.3 GROUP BY句

                                                                                                                                                                                GROUP BY句は通常以下の形式となります(この句は省略可能です)。

                                                                                                                                                                                  GROUP BY expression [, ...]

                                                                                                                                                                                  GROUP BYは、グループ化のために与えられた式を評価し、結果が同じ値になった行を1つの行にまとめる機能を持ちます。expressionには、入力列の名前、出力列(SELECTリスト項目)の名前/序数、あるいは入力列の値を計算する任意の式を取ることができます。判断がつかない時は、GROUP BYの名前は出力列名ではなく入力列名として解釈されます。

                                                                                                                                                                                  集約関数が使用された場合、各グループ内の全ての行を対象に計算が行われ、結果としてグループごとの値が生成されます(一方GROUP BYがなければ、集約関数は選択された全ての行を対象に計算を行い、1つの値を生成します)。GROUP BYが存在する場合、集約関数内部以外で、グループ化されていない列を参照するSELECTリストは無効になります。グループ化されていない列について返される値は複数の値になってしまう可能性があるからです。

                                                                                                                                                                                  3.3.48.4 HAVING句

                                                                                                                                                                                  HAVING句は通常以下の形式となります(この句は省略可能です)。

                                                                                                                                                                                    HAVING condition

                                                                                                                                                                                    conditionWHERE句で指定するものと同じです。

                                                                                                                                                                                    HAVINGは、グループ化された行の中で、条件を満たさない行を取り除く機能を持ちます。HAVINGWHEREは次の点が異なります。WHEREが、GROUP BYの適用前に個々の行に対してフィルタを掛けるのに対し、HAVINGは、GROUP BYの適用後に生成されたグループ化された行に対してフィルタをかけます。condition内で使用する列は、集約関数内で使用されたものを除き、グループ化された列を一意に参照するものでなければなりません。

                                                                                                                                                                                    3.3.48.5 SELECTリスト

                                                                                                                                                                                    SELECTリスト(SELECTFROMの間にあるキーワード)は、SELECT文の出力行を形成する式を指定するものです。この式では、FROM句で処理後の列を参照することができます(通常は実際に参照します)。AS output_nameを使用すると、出力列に元の名前とは別の名前を付けることができます。この名前は、主に表示用の列ラベルとして使われます。また、ORDER BY句とGROUP BY句内で列の値を参照する時も、この名前を使用できます。しかし、WHEREHAVING句では使用できません。これらでは式を書かなければなりません。

                                                                                                                                                                                    リストには、選択された行の全ての列を表す省略形として、式ではなく*と書くことができます。

                                                                                                                                                                                    3.3.48.6 UNION句

                                                                                                                                                                                    UNION句は通常以下の形式となります。

                                                                                                                                                                                      select_statement UNION [ ALL ] select_statement

                                                                                                                                                                                      select_statementには、ORDER BYFOR UPDATE句を持たない任意のSELECT文が入ります(ORDER BYは、括弧で囲めば複式として付与することができます。括弧がない場合、これらの句は右側に置かれた入力式ではなく、UNIONの結果に対して適用されてしまいます)。

                                                                                                                                                                                      UNION演算子は、2つのSELECT文が返す行の和集合を作成します。この和集合には、2つのSELECT文の結果集合のいずれか(または両方)に存在する行が全て含まれています。UNIONの直接のオペランドとなるSELECT文同士が返す列数は、同じでなければなりません。また、対応する列のデータ型には互換性が存在する必要があります。

                                                                                                                                                                                      ALLオプションが指定されていない限り、UNIONの結果には重複行は含まれません。ALLを指定するとこのような重複除去が行われません。

                                                                                                                                                                                      1つのSELECT文に複数のUNION演算子がある場合、括弧がない限り、それらは左から右に評価されます。

                                                                                                                                                                                      現時点では、UNIONの結果やUNIONに対する入力に、FOR UPDATEを指定することはできません。

                                                                                                                                                                                      3.3.48.7 INTERSECT句

                                                                                                                                                                                      INTERSECT句は通常以下の形式となります。

                                                                                                                                                                                        select_statement INTERSECT select_statement

                                                                                                                                                                                        select_statementには、ORDER BYFOR UPDATE句を持たない、任意のSELECT文が入ります。

                                                                                                                                                                                        INTERSECTは、2つのSELECT文が返す行の積集合を計算します。この積集合に含まれるのは、2つのSELECT文の結果集合の両方に存在する行です。

                                                                                                                                                                                        INTERSECTの結果に重複行は含まれません。

                                                                                                                                                                                        1つのSELECT文に複数のINTERSECT演算子がある場合、括弧がない限り、それらは左から右に評価されます。INTERSECTUNIONよりも強い結び付きを持ちます。つまり、A UNION B INTERSECT CA UNION (B INTERSECT C) と解釈されます。

                                                                                                                                                                                        3.3.48.8 MINUS句

                                                                                                                                                                                        MINUS句は通常以下の形式となります。

                                                                                                                                                                                          select_statement MINUS select_statement

                                                                                                                                                                                          select_statementには、ORDER BYFOR UPDATE句を持たない、任意のSELECT文が入ります。

                                                                                                                                                                                          MINUSは、左側のSELECT文の結果には存在し、右側のSELECT文の結果には存在しない行の集合を生成します。

                                                                                                                                                                                          MINUSの結果には重複行は含まれません。

                                                                                                                                                                                          1つのSELECT文に複数のMINUS演算子がある場合、括弧がない限り、それらは左から右に評価されます。MINUSの結び付きの強さはUNIONと同じです。

                                                                                                                                                                                          3.3.48.9 CONNECT BY句

                                                                                                                                                                                          CONNECT BY句は階層問い合わせ時に行の親子関係を決定します。通常以下の形式となります。

                                                                                                                                                                                            CONNECT BY { PRIOR parent_expr = child_expr |  
                                                                                                                                                                                              child_expr = PRIOR parent_expr }

                                                                                                                                                                                            parent_exprは親の候補行で評価されます。FROM句で返される行において、parent_expr = child_exprが真の場合、その行は親の子と見なされます。

                                                                                                                                                                                            以下の句はCONNECT BY句と一緒に指定できます(この句は省略可能です)。

                                                                                                                                                                                            START WITH start_expression

                                                                                                                                                                                                FROM句で返される行をstart_expressionで評価した結果が真の場合、その行が階層のルートノードになります。

                                                                                                                                                                                            ORDER SIBLINGS BY expression [ ASC | DESC ] [, ...]

                                                                                                                                                                                                expressionによって、同じ親の兄弟である行を順序付けます。

                                                                                                                                                                                            (階層問い合わせに関する詳細は、第2.2.5章を参照してください。)

                                                                                                                                                                                            3.3.48.10 ORDER BY句

                                                                                                                                                                                            ORDER BY句は通常以下の形式となります(この句は省略可能です)。

                                                                                                                                                                                              ORDER BY expression [ ASC | DESC ] [, ...]

                                                                                                                                                                                              expressionには、出力列(SELECTリスト項目)の名前/序数、あるいは入力列値から形成される任意の式を取ることができます。

                                                                                                                                                                                              ORDER BY句を使うと、結果行を指定した式に従ってソートすることができます。最も左側の式を使って比較した結果、2つの行が等しいと判断された場合は、1つ右側の式を使って比較します。その結果も等しければ、さらに次の式に進みます。指定した全ての式で等しいと判断された場合は、実装に依存した順番で返されます。

                                                                                                                                                                                              序数は、結果列の位置(左から右に割り当てられます)を示します。これを使うと、一意な名前を持たない列の順序を定義することができます。AS句を使用すれば結果列に名前を割り当てることができるので、これはどうしても必要な機能というわけではありません。

                                                                                                                                                                                              また、ORDER BY句には、SELECT結果リストに出現しない列を含む、任意の式を使用できます。したがって、以下の文は有効です。

                                                                                                                                                                                                SELECT ename FROM emp ORDER BY empno;

                                                                                                                                                                                                ただし、UNIONINTERSECTMINUSの結果にORDER BYを適用する場合は、式は使用できず、出力列の名前か序数のみを指定できるという制限があります。

                                                                                                                                                                                                ORDER BYの式として結果列名と入力列名の両方に一致する単なる名前が与えられた場合、ORDER BYはそれを結果列名として扱います。これは、同じ状況におけるGROUP BYの選択とは反対です。この不整合は、標準SQLとの互換性を保持するために発生しています。

                                                                                                                                                                                                ORDER BY中の任意の式の後に、省略可能なキーワードASC(昇順)、DESC(降順)を付加することができます。指定がなければ、デフォルトでASCがあるものとして扱われます。

                                                                                                                                                                                                null値は他の値よりも上位の値としてソートされます。言い換えると、ソート順が昇順の時はnull値は最後に、降順の時はnull値は最初にソートされます。

                                                                                                                                                                                                文字型データでは、データベースクラスタの初期化時に決定されるロケール指定の照合順に従ってソートされます。

                                                                                                                                                                                                3.3.48.11 DISTINCT句

                                                                                                                                                                                                DISTINCTが指定されると、重複する行は全て結果セットから削除されます(それぞれ1行のみが保持されます)。ALLはこの反対で、全ての行が保持されます。デフォルトはこちらです。

                                                                                                                                                                                                3.3.48.12 FOR UPDATE句

                                                                                                                                                                                                FOR UPDATE句は以下の形式となります。

                                                                                                                                                                                                  FOR UPDATE

                                                                                                                                                                                                  FOR UPDATEを使用すると、SELECT文によって検索された行が更新用にロックされます。これにより、現行のトランザクションが終了するまでは、これらの行が他のトランザクションによって変更されたり削除されたりすることがなくなります。つまり、現行のトランザクションが終了するまでは、他のトランザクションがこれらの行に対してUPDATEDELETESELECT FOR UPDATEを試行しても拒否されます。また、他のトランザクションからのUPDATEDELETESELECT FOR UPDATEによって選択した行がロックされている場合、SELECT FOR UPDATEを実行しようとすると、SELECT FOR UPDATEはそのトランザクションが終了するのを待ってから、その後行をロックして更新された行を返します(行が削除された場合は返しません)。

                                                                                                                                                                                                  FOR UPDATEは、返される行がテーブルのどの行に対応するのかが明確に識別できない場合には使用することができません。例えば、集約には使用できません。

                                                                                                                                                                                                  deptテーブルをempテーブルと結合します。

                                                                                                                                                                                                    SELECT d.deptno, d.dname, e.empno, e.ename, e.mgr, e.hiredate  
                                                                                                                                                                                                        FROM emp e, dept d  
                                                                                                                                                                                                        WHERE d.deptno = e.deptno;
                                                                                                                                                                                                      
                                                                                                                                                                                                     deptno |   dname    | empno | ename  | mgr  |      hiredate  
                                                                                                                                                                                                    --------+------------+-------+--------+------+--------------------  
                                                                                                                                                                                                         10 | ACCOUNTING |  7934 | MILLER | 7782 | 23-JAN-82 00:00:00  
                                                                                                                                                                                                         10 | ACCOUNTING |  7782 | CLARK  | 7839 | 09-JUN-81 00:00:00  
                                                                                                                                                                                                         10 | ACCOUNTING |  7839 | KING   |      | 17-NOV-81 00:00:00  
                                                                                                                                                                                                         20 | RESEARCH   |  7788 | SCOTT  | 7566 | 19-APR-87 00:00:00  
                                                                                                                                                                                                         20 | RESEARCH   |  7566 | JONES  | 7839 | 02-APR-81 00:00:00  
                                                                                                                                                                                                         20 | RESEARCH   |  7369 | SMITH  | 7902 | 17-DEC-80 00:00:00  
                                                                                                                                                                                                         20 | RESEARCH   |  7876 | ADAMS  | 7788 | 23-MAY-87 00:00:00  
                                                                                                                                                                                                         20 | RESEARCH   |  7902 | FORD   | 7566 | 03-DEC-81 00:00:00  
                                                                                                                                                                                                         30 | SALES      |  7521 | WARD   | 7698 | 22-FEB-81 00:00:00  
                                                                                                                                                                                                         30 | SALES      |  7844 | TURNER | 7698 | 08-SEP-81 00:00:00  
                                                                                                                                                                                                         30 | SALES      |  7499 | ALLEN  | 7698 | 20-FEB-81 00:00:00  
                                                                                                                                                                                                         30 | SALES      |  7698 | BLAKE  | 7839 | 01-MAY-81 00:00:00  
                                                                                                                                                                                                         30 | SALES      |  7654 | MARTIN | 7698 | 28-SEP-81 00:00:00  
                                                                                                                                                                                                         30 | SALES      |  7900 | JAMES  | 7698 | 03-DEC-81 00:00:00  
                                                                                                                                                                                                    (14 行)

                                                                                                                                                                                                    全ての従業員のsal列を合計しdeptno列によって結果をグループ化します。

                                                                                                                                                                                                      SELECT deptno, SUM(sal) AS total  
                                                                                                                                                                                                          FROM emp  
                                                                                                                                                                                                          GROUP BY deptno;
                                                                                                                                                                                                        
                                                                                                                                                                                                       deptno |  total  
                                                                                                                                                                                                      --------+----------  
                                                                                                                                                                                                           10 |  8750.00  
                                                                                                                                                                                                           20 | 10875.00  
                                                                                                                                                                                                           30 |  9400.00  
                                                                                                                                                                                                      (3 行)

                                                                                                                                                                                                      全ての従業員のsal列を合計しdeptno列によって結果をグループ化し、合計が10000より少ないグループの合計を表示します。

                                                                                                                                                                                                        SELECT deptno, SUM(sal) AS total  
                                                                                                                                                                                                            FROM emp  
                                                                                                                                                                                                            GROUP BY deptno  
                                                                                                                                                                                                            HAVING SUM(sal) < 10000;
                                                                                                                                                                                                          
                                                                                                                                                                                                         deptno |  total  
                                                                                                                                                                                                        --------+---------  
                                                                                                                                                                                                             10 | 8750.00  
                                                                                                                                                                                                             30 | 9400.00  
                                                                                                                                                                                                        (2 rows)

                                                                                                                                                                                                        次に、結果を2番目の列(dname)の内容に基づいてソートする方法を2つ例示します。

                                                                                                                                                                                                          SELECT * FROM dept ORDER BY dname;
                                                                                                                                                                                                            
                                                                                                                                                                                                           deptno |   dname    |   loc  
                                                                                                                                                                                                          --------+------------+----------  
                                                                                                                                                                                                               10 | ACCOUNTING | NEW YORK  
                                                                                                                                                                                                               40 | OPERATIONS | BOSTON  
                                                                                                                                                                                                               20 | RESEARCH   | DALLAS  
                                                                                                                                                                                                               30 | SALES      | CHICAGO  
                                                                                                                                                                                                          (4 rows)
                                                                                                                                                                                                            
                                                                                                                                                                                                          SELECT * FROM dept ORDER BY 2;
                                                                                                                                                                                                            
                                                                                                                                                                                                           deptno |   dname    |   loc  
                                                                                                                                                                                                          --------+------------+----------  
                                                                                                                                                                                                               10 | ACCOUNTING | NEW YORK  
                                                                                                                                                                                                               40 | OPERATIONS | BOSTON  
                                                                                                                                                                                                               20 | RESEARCH   | DALLAS  
                                                                                                                                                                                                               30 | SALES      | CHICAGO  
                                                                                                                                                                                                          (4 rows)

                                                                                                                                                                                                          3.3.49 SET CONSTRAINTS

                                                                                                                                                                                                          名前

                                                                                                                                                                                                          SET CONSTRAINTS -- 現在のトランザクションの制約検査モードを設定する

                                                                                                                                                                                                          概要

                                                                                                                                                                                                          SET CONSTRAINTS { ALL | name [, ...] } { DEFERRED | IMMEDIATE }

                                                                                                                                                                                                          説明

                                                                                                                                                                                                          SET CONSTRAINTSは、現在のトランザクションにおける制約の検査方法を設定します。IMMEDIATE制約は、1つの文の実行が終わるごとに検査されます。DEFERRED制約は、トランザクションがコミットされるまで検査されません。全ての制約は、IMMEDIATEDEFERREDのどちらかのモードを持ちます。

                                                                                                                                                                                                          制約にはその生成時点で、DEFERRABLE INITIALLY DEFERREDDEFERRABLE INITIALLY IMMEDIATENOT DEFERRABLEの3つのうちのいずれかの性質が与えられます。3番目のNOT DEFERRABLE制約は、常にIMMEDIATEモードであり、SET CONSTRAINTSコマンドの影響を受けません。DEFERRABLE INITIALLY DEFERRED制約とDEFERRABLE INITIALLY IMMEDIATE制約の2つは、トランザクションを指定されたモードで開始しますが、トランザクション内でSET CONSTRAINTSを使用するとその振舞いを変更することができます。

                                                                                                                                                                                                          制約名のリストを持ったSET CONSTRAINTSが変更するのは、これらの制約のモードのみです(これらは全て遅延可能です)。指定された名前に一致する複数の制約がある場合、すべての制約に影響を受けます。SET CONSTRAINTS ALLは遅延可能な全ての制約のモードを変更します。

                                                                                                                                                                                                          SET CONSTRAINTSを使用して制約のモードをDEFERREDからIMMEDIATEに変更した場合は、新しい制約モードが遡及的に有効になります。つまりDEFERREDモードであればトランザクションの終了時に検査される未検査のデータ変更が、SET CONSTRAINTSコマンドの実行中に検査されます。もし、この時に何らかの制約違反があった場合、SET CONSTRAINTSは失敗します(そして、制約モードは変更されません)。したがって、SET CONSTRAINTSを利用すれば、トランザクションの特定の時点で強制的に制約の検査を実行することができます。

                                                                                                                                                                                                          今のところ、外部キー制約だけがこの設定の影響を受けます。検査制約や一意性制約の実行が遅延されることはありません。

                                                                                                                                                                                                          注釈

                                                                                                                                                                                                          このコマンドが変更するのは、現在のトランザクション内の制約の動作のみです。したがって、トランザクションブロックの外部でこのコマンドが実行されても、何ら効果はありません。

                                                                                                                                                                                                          3.3.50 SET ROLE

                                                                                                                                                                                                          名前

                                                                                                                                                                                                          SET ROLE -- 現在のセッションにおける現在のユーザ識別子を設定する

                                                                                                                                                                                                          概要

                                                                                                                                                                                                          SET ROLE { rolename | NONE }

                                                                                                                                                                                                          説明

                                                                                                                                                                                                          このコマンドは現在のSQLセッションにおける現在のユーザ識別子をrolenameに設定します。SET ROLEの後、SQLコマンドに対する権限検査は、指名されたロールで普通にログインした場合と同様に行われます。

                                                                                                                                                                                                          指定するrolenameは、現在のセッションユーザがメンバとして属するロールでなければなりません。(セッションユーザがスーパーユーザであった場合、任意のロールを選択することができます。)

                                                                                                                                                                                                          NONEは、現在のユーザ識別子を現在のセッションユーザ識別子に戻します。この形式はすべてのユーザが実行することができます。

                                                                                                                                                                                                          注釈

                                                                                                                                                                                                          このコマンドを使用して、権限を追加することも制限することもできます。セッションユーザのロールがINHERITS属性を持つ場合、自動的にSET ROLEで設定されたすべてのロールの権限を持ちます。この場合、SET ROLEは実際、セッションユーザに直接割り当てられている権限、セッションユーザが属するロールに割り当てられている権限の内、指名されたロールで使用可能な権限を残し、他をすべて削除します。一方、セッションユーザのロールがNOINHERITS属性を持つ場合、SET ROLEセッションユーザに直接割り当てられた権限をすべて削除し、指名されたロールで利用可能な権限を獲得します。

                                                                                                                                                                                                          特に、スーパーユーザが非特権ユーザへのSET ROLEを行うと、スーパーユーザ権限を失うことになります。

                                                                                                                                                                                                          ユーザmaryadminsロールのユーザ識別子を設定します。

                                                                                                                                                                                                            SET ROLE admins;

                                                                                                                                                                                                            ユーザmaryをもともとのユーザ識別子へ戻します。

                                                                                                                                                                                                              SET ROLE NONE;

                                                                                                                                                                                                              関連項目

                                                                                                                                                                                                              ALTER ROLE, CREATE ROLE, DROP ROLE, GRANT, REVOKE

                                                                                                                                                                                                              3.3.51 SET TRANSACTION

                                                                                                                                                                                                              名前

                                                                                                                                                                                                              SET TRANSACTION -- 現在のトランザクションの特性を設定する

                                                                                                                                                                                                              概要

                                                                                                                                                                                                              SET TRANSACTION transaction_mode

                                                                                                                                                                                                              ここでtransaction_modeは以下のいずれかです。

                                                                                                                                                                                                                ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED }
                                                                                                                                                                                                                READ WRITE | READ ONLY

                                                                                                                                                                                                              説明

                                                                                                                                                                                                              SET TRANSACTIONは現在のトランザクションの特性を設定します。これはその後のトランザクションには影響を及ぼしません。

                                                                                                                                                                                                              利用可能なトランザクション特性はトランザクションの隔離レベルとトランザクションのアクセスモード(読み書きモードもしくは読み取りモード)です。

                                                                                                                                                                                                              トランザクションの隔離レベルは、並行して実行中の他のトランザクションが存在する場合、そのトランザクションが見ることができるデータを決定するものです。

                                                                                                                                                                                                              READ COMMITTED

                                                                                                                                                                                                                  1つ1つの文から見ることができるのは、その文が開始される前にコミットされた行のみです。これがデフォルトです。

                                                                                                                                                                                                              SERIALIZABLE

                                                                                                                                                                                                                  現在のトランザクションにおける全ての文は、トランザクションで最初の問い合わせ文またはデータを変更する文が実行される前にコミットされた行だけを見ることができます。

                                                                                                                                                                                                              トランザクション隔離レベルは、そのトランザクションにおける最初の問い合わせ文やデータ更新文(SELECTINSERTDELETEUPDATEFETCH)が実行された後からは変更することができません。

                                                                                                                                                                                                              トランザクションのアクセスモードは、そのトランザクションが読み書き可能か読み取りのみかを決定します。デフォルトは読み書き可能です。読み取りのみのトランザクションでは、書き込み対象のテーブルが一時テーブルでない限り、INSERTUPDATEDELETEのSQLコマンドを実行できません。また、CREATEALTERDROP系の全てのSQLコマンド、COMMENTGRANTREVOKETRUNCATEは、まったく実行できません。さらに、EXECUTEコマンドに上述のコマンドの実行が含まれている場合、これらのコマンドも実行できません。この方法ではディスクへの書き込み防止をまったく行わないので、読み取り専用を高レベルで実現する考え方と言えます。

                                                                                                                                                                                                              3.3.52 TRUNCATE

                                                                                                                                                                                                              名前

                                                                                                                                                                                                              TRUNCATE -- テーブルを空にする

                                                                                                                                                                                                              概要

                                                                                                                                                                                                              TRUNCATE TABLE name

                                                                                                                                                                                                              説明

                                                                                                                                                                                                              TRUNCATEはテーブルから全ての行を素早く削除します。各テーブルに対して条件指定のないDELETEコマンドの実行と同じ効果を持ちますが、実際にテーブルを走査しない分、このコマンドの方が高速です。このコマンドは、大きなテーブルを対象とする場合に最も有用です。

                                                                                                                                                                                                              パラメータ

                                                                                                                                                                                                              name

                                                                                                                                                                                                                  空にするテーブルの名前です(スキーマ修飾名も可)。

                                                                                                                                                                                                              注釈

                                                                                                                                                                                                              そのテーブルが他のテーブルから外部キーで参照されている場合、TRUNCATEを使用することはできません。このような場合は、有効性を検査するためにテーブルスキャンが必要になりますが、テーブルスキャンを行うのであれば、このコマンドの利点がなくなるからです。

                                                                                                                                                                                                              TRUNCATEは、テーブルに存在するユーザ定義のON DELETEトリガを一切実行しません。

                                                                                                                                                                                                              bigtableテーブルを空にします。

                                                                                                                                                                                                                TRUNCATE TABLE bigtable;

                                                                                                                                                                                                                関連項目

                                                                                                                                                                                                                DELETE

                                                                                                                                                                                                                3.3.53 UPDATE

                                                                                                                                                                                                                名前

                                                                                                                                                                                                                UPDATE -- テーブルの行を更新する

                                                                                                                                                                                                                概要

                                                                                                                                                                                                                UPDATE [ optimizer_hint ] table[@dblink ]
                                                                                                                                                                                                                    SET column = { expression | DEFAULT } [, ...]
                                                                                                                                                                                                                  [ WHERE condition ]
                                                                                                                                                                                                                  [ RETURNING return_expression [, ...]
                                                                                                                                                                                                                      { INTO { record | variable [, ...] }
                                                                                                                                                                                                                      | BULK COLLECT INTO collection [, ...] } ]

                                                                                                                                                                                                                説明

                                                                                                                                                                                                                UPDATEは、条件を満たす全ての行の指定した列の値を変更します。SET句には、変更する列のみを指定する必要があります。SET句にて明示的に指定されなかった列の値は変更されません。

                                                                                                                                                                                                                UPDATEコマンドがSPLプログラム内で使用される場合のみ、RETURNING INTO { record | variable [, ...] }句を指定できます。さらに、UPDATEコマンドの結果は1行以下でなければいけません。結果が2行以上の場合は例外が発生します。結果が空の場合、recordもしくはvariableにはnullが代入されます。

                                                                                                                                                                                                                UPDATEコマンドがSPLプログラム内で使用される場合のみ、RETURNING BULK COLLECT INTO collection [, ...]句を指定できます。BULK COLLECT INTO句の対象として複数のcollectionが指定された場合、各collectionは単一のスカラーフィールドでなければいけません。つまり、collectionはレコードではいけません。UPDATEコマンドの結果、行が全く更新されないか、複数の行が更新されます。結果の各行に対して評価されるreturn_expressioncollectionの要素になります。collection内の既存の行は削除されます。結果が空の場合、collectionは空になります。

                                                                                                                                                                                                                テーブルを変更するにはUPDATE権限が必要です。さらに、expressionconditionで読み込むテーブルに対するSELECT権限も必要になります。

                                                                                                                                                                                                                パラメータ

                                                                                                                                                                                                                optimizer_hint

                                                                                                                                                                                                                    オプティマイザが実行計画を選択する時に使用するコメント内に置かれるヒントです。オプティマイザ・ヒントに関する詳細は、第3.4章を参照してください。

                                                                                                                                                                                                                table

                                                                                                                                                                                                                    更新対象のテーブルの名前です(スキーマ修飾名でも可)。

                                                                                                                                                                                                                dblink

                                                                                                                                                                                                                    リモートのデータベースを識別するデータベースリンクの名前です。データベースリンクに関する詳細は、CREATE DATABASE LINKコマンドを参照してください。

                                                                                                                                                                                                                column

                                                                                                                                                                                                                    table内の列名です。

                                                                                                                                                                                                                expression

                                                                                                                                                                                                                    列に代入する式です。 この式では、テーブル内の対象列やその他の列の変更前の値を使用することができます。

                                                                                                                                                                                                                DEFAULT

                                                                                                                                                                                                                    列にデフォルト値を設定します (デフォルト式が割り当てられていない場合はnullになります)。

                                                                                                                                                                                                                condition

                                                                                                                                                                                                                    BOOLEAN型の値を返す式です。 この式がtrueを返す行のみが更新されます。

                                                                                                                                                                                                                return_expression

                                                                                                                                                                                                                    tableの1つ以上の列を含む式です。return_expressiontableの列名が指定された場合、return_expressionの評価後に列に代入される値は以下のように決定されます。

                                                                                                                                                                                                                      return_expressionで指定した列にUPDATEコマンド内で値が割り当てられている場合、return_expressionの評価時にその値が使用されます。

                                                                                                                                                                                                                      return_expressionで指定した列にUPDATEコマンド内で値が割り当てられていない場合、return_expressionの評価時に対象行の現在の列の値が使用されます。

                                                                                                                                                                                                                record

                                                                                                                                                                                                                    return_expressionで評価された結果が割り当てられるレコードです。return_expressionでの最初の結果がrecord内の最初の項目に割り当てられます。2番目の結果が2番目の項目に割り当てられます。以下、同様です。record内の項目数は式の数と同じでなければいけません。また、項目は対応する式と型に互換性がなければいけません。

                                                                                                                                                                                                                variable

                                                                                                                                                                                                                    return_expressionで評価された結果が割り当てられる変数です。1つ以上のreturn_expressionvariableが指定された場合、return_expressionでの最初の結果が最初のvariableに割り当てられます。2番目の結果が2番目のvariableに割り当てられます。以下、同様です。INTOに続いて指定される変数の数は、RETURNINGに続いて指定される式の数と同じでなければいけません。また、変数は対応する式と型に互換性がなければいけません。

                                                                                                                                                                                                                collection

                                                                                                                                                                                                                    return_expressionで評価された結果から作成される要素の集合です。単一の集合、つまり単一フィールドの集合かもしれませんし、レコード型の集合かもしれません。もしくは、各集合が単一フィールドからなる複数の集合かもしれません。式の数は、すべての指定した集合のフィールド数と同じでなければいけません。また、対応するreturn_expressioncollectionフィールドは型に互換性がなければいけません。

                                                                                                                                                                                                                deptテーブルでdeptno列が20の行のloc列をAUSTINに変更します。

                                                                                                                                                                                                                  UPDATE dept SET loc = 'AUSTIN' WHERE deptno = 20;

                                                                                                                                                                                                                  empテーブルでjob列がSALESMANのすべての行に対して、sal列を10%、comm列を500増やします。

                                                                                                                                                                                                                    UPDATE emp SET sal = sal * 1.1, comm = comm + 500 WHERE job = 'SALESMAN';

                                                                                                                                                                                                                    Previous PageTable Of ContentsNext Page