ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 


REVOKE文: ロール

別のユーザーまたはロールのロールを取り消します。

環境

REVOKE文は次の環境のロールで使用できます。


形式



引数

ALL ROLES

リストされたユーザーに割り当てられているロールをすべて取り消します。

FROM username

FROM role-name

FROM PUBLIC

指定したロールが取り消されるユーザー、ロールまたはPUBLICユーザーを指定します。

role-name

CREATE ROLE文で作成された、またはGRANT文で自動作成された既存のロールの名前です。

使用方法


例1: ロールの付与および取消し


SQL> -- Optionally, create three users and two roles.
SQL> -- Oracle Rdb automatically generates users and
SQL> -- roles if they are identified externally.
SQL> CREATE USER ABLOWNEY IDENTIFIED EXTERNALLY;
SQL> CREATE USER BGREMBO IDENTIFIED EXTERNALLY;
SQL> CREATE USER LWARD IDENTIFIED EXTERNALLY;
SQL> CREATE ROLE SALES_MANAGER IDENTIFIED EXTERNALLY;
SQL> CREATE ROLE DIVISION_MANAGER IDENTIFIED EXTERNALLY;
SQL> -- Grant the SALES_MANAGER role to users ABLOWNEY and
SQL> -- BGREMBO. Also grant the SALES_MANAGER role to the
SQL> -- DIVISION MANAGER ROLE.
SQL> GRANT SALES_MANAGER TO ABLOWNEY, BGREMBO, DIVISION_MANAGER;
SQL> -- Grant the DIVISION_MANAGER role to LWARD. LWARD now
SQL> -- has both the SALES_MANAGER and DIVISION_MANAGER roles.
SQL> GRANT DIVISION_MANAGER TO LWARD;
SQL> -- Revoke the DIVISION_MANAGER role from LWARD. He has
SQL> -- left the company.
SQL> REVOKE DIVISION_MANAGER FROM LWARD;
SQL> -- Grant the DIVISION_MANAGER role to BGREMBO.  She
SQL> -- has been promoted to division manager.
SQL> GRANT DIVISION_MANAGER TO BGREMBO;


ROLLBACK文

トランザクションを終了し、そのトランザクションの開始以降に行ったすべての変更を元に戻します。また、ROLLBACK文は次を実行します。

ROLLBACK文は次のものに反映されます。


環境

ROLLBACK文は次の環境で使用できます。


形式



引数

AND CHAIN

ロールバックされたトランザクションと同じ属性を使用して、新規トランザクションを暗黙的に開始します。

WORK

ROLLBACK文には影響のないオプション・キーワードを指定します。この引数は、ANSI/ISO SQL規格との互換性を目的としています。

使用方法


例1: COBOLプログラムでの変更のロールバック


GET-ID-NUMBER.
      DISPLAY "Enter employee ID number:  "
         WITH NO ADVANCING.
      ACCEPT EMPLOYEE-ID.
CHANGE-SALARY.
      DISPLAY "Enter new salary amount:  "
         WITH NO ADVANCING.
      ACCEPT SALARY-AMOUNT.

EXEC SQL  UPDATE  SALARY_HISTORY
          SET     SALARY_AMOUNT = :SALARY-AMOUNT
          WHERE   EMPLOYEE_ID = :EMPLOYEE-ID
          AND     END_DATE IS NULL
END-EXEC

      DISPLAY EMPLOYEE-ID, SALARY-AMOUNT.
      DISPLAY "Is this figure correct? [Y or N]  "
         WITH NO ADVANCING.
      ACCEPT ANSWER.
      IF ANSWER = "Y" THEN

        EXEC SQL  COMMIT END-EXEC
      ELSE
        EXEC SQL  ROLLBACK END-EXEC
        DISPLAY "Please enter the new salary amount again."
        GO TO CHANGE-SALARY
      END-IF.

例2: COMMITおよびAND CHAINの使用

次の単純な例では、プロシージャの開始時にSET TRANSACTIONを1回実行します。その後、COMMIT AND CHAIN構文を使用して、トランザクションを定期的にコミットし、再開します。トランザクション特性の定義は1つのみのため、これによってアプリケーションが簡略化されています。


SQL> -- process table in batches
SQL>
SQL> set compound transactions 'internal';
SQL> set flags 'transaction,trace';
SQL>
SQL> begin
cont> declare :counter integer = 0;
cont> declare :emp integer;
cont>
cont> set transaction
cont>     read write
cont>     reserving employees for exclusive write;
cont>
cont> for :emp in 0 to 600
cont> do
cont>     begin
cont>     declare :id char(5)
cont>           default substring (cast (:emp+100000 as varchar(6))
cont>                              from 2 for 5);
cont>     if exists (select * from employees where employee_id = :id)
cont>     then
cont>         trace 'found: ', :id;
cont>         if :counter > 20
cont>         then
cont>             commit and chain;
cont>             set :counter = 1;
cont>         else
cont>             set :counter = :counter + 1;
cont>         end if;
cont>     end if;
cont>     end;
cont> end for;
cont>
cont> commit;
cont> end;
~T Compile transaction (1) on db: 1
~T Transaction Parameter Block: (len=2)
0000 (00000) TPB$K_VERSION = 1
0001 (00001) TPB$K_WRITE (read write)
~T Start_transaction (1) on db: 1, db count=1
~T Rollback_transaction on db: 1
~T Compile transaction (3) on db: 1
~T Transaction Parameter Block: (len=14)
0000 (00000) TPB$K_VERSION = 1
0001 (00001) TPB$K_WRITE (read write)
0002 (00002) TPB$K_LOCK_WRITE (reserving) "EMPLOYEES" TPB$K_EXCLUSIVE
~T Start_transaction (3) on db: 1, db count=1
~Xt: found: 00164
   .
   .
   .
~Xt: found: 00184
~Xt: found: 00185
~T Commit_transaction on db: 1
~T Prepare_transaction on db: 1
~T Restart_transaction (3) on db: 1, db count=1
~Xt: found: 00186
   .
   .
   .
~Xt: found: 00205
~Xt: found: 00206
~T Commit_transaction on db: 1
~T Prepare_transaction on db: 1
~T Restart_transaction (3) on db: 1, db count=1
~Xt: found: 00207
   .
   .
   .
~Xt: found: 00228
~Xt: found: 00229
~T Commit_transaction on db: 1
~T Prepare_transaction on db: 1
~T Restart_transaction (3) on db: 1, db count=1
~Xt: found: 00230
   .
   .
   .
~Xt: found: 00249
~Xt: found: 00267
~T Commit_transaction on db: 1
~T Prepare_transaction on db: 1
~T Restart_transaction (3) on db: 1, db count=1
~Xt: found: 00276
   .
   .
   .
~Xt: found: 00435
~Xt: found: 00471
~T Commit_transaction on db: 1
~T Prepare_transaction on db: 1
SQL>


SELECT文: 一般形式

結果表を指定します。結果表は、選択式によって指定された条件を満たしている、1つ以上の表またはビューの列と行から導出された値の中間表です。これらの列と行が属する表またはビューは、SELECT文のFROM句で識別されます。

SELECT文の基本要素を選択式と呼びます。選択式の詳細は、第2.8.1項を参照してください。

ホスト言語プログラムの結果表の行を取得するには、DECLARE CURSOR文を使用するか、またはシングルトン選択と呼ばれる特殊な形式のSELECT文を使用する必要があります。シングルトン選択の詳細は、「SELECT文: シングルトン選択」を参照してください。

SQLでは、SELECT文の句は次の順序で評価されます。

  1. FROM

  2. WHERE

  3. GROUP BY

  4. HAVING

  5. 選択リスト

  6. ORDER BY

  7. LIMIT TO

  8. OPTIMIZE

これらのそれぞれの句の後に、次の句の評価に使用する中間結果表が作成されます。


環境

SELECT文の一般形式は、対話型SQLおよび動的SQLでのみ使用できます。

形式



















引数

EDIT USING edit-string

EDIT USING domain-name

編集文字列を値式に関連付けます。この句により、問合せで列または変数に対して定義されたEDIT STRINGはすべて無効になります。この句は対話型SQLでのみ使用できます。

FOR UPDATE OF column-name

ユーザーまたはユーザーのプログラムが後でUPDATE文を使用して変更するカーソルの列を指定します。FOR UPDATE句の列名は、FROM句に指定された表またはビューに属している必要があります。

次の場合は、後でUPDATE文を使用して行を変更するためにSELECT文のFOR UPDATE句を指定する必要はありません。

SELECT文のFOR UPDATE OF句は、選択された行をすべてロックしてUPDATE ONLY CURSORセマンティクスを提供します。

OPTIMIZE AS query-name

名前を問合せに割り当てます。RDMS$DEBUG_FLAGS論理名を定義するか、または'STRATEGY'オプションを指定したSET FLAGSを使用して、問合せ結果の作成に使用されるアクセス・メソッドを確認できます。次の例は、OPTIMIZE AS句の使用方法を示しています。


SQL> DELETE FROM EMPLOYEES E
cont> WHERE EXISTS ( SELECT *
cont>                FROM   SALARY_HISTORY S
cont>                WHERE  S.EMPLOYEE_ID = E.EMPLOYEE_ID
cont>                AND    S.SALARY_AMOUNT > 75000)
cont> OPTIMIZE AS DEL_EMPLOYEE;
Leaf#01 FFirst RDB$RELATIONS Card=19
   .
   .
   .
~Query Name : DEL_EMPLOYEE
   .
   .
   .
7 rows deleted

OPTIMIZE FOR

選択式を指定する文に対して優先するオプティマイザ計画を指定します。次のオプションを使用できます。

OPTIMIZE USING outline-name

選択式とアウトラインでアウトラインIDが異なる場合でも、選択式で使用する問合せアウトラインを明示的に指定します。

次の例では、WOMENS_DEGREESという名前のアウトラインを作成する問合せを示します。


SQL> SELECT E.LAST_NAME, E.EMPLOYEE_ID, D.DEGREE, D.DEGREE_FIELD, D.YEAR_GIVEN
cont> FROM EMPLOYEES E, DEGREES D WHERE E.SEX = 'F'
cont> AND E.EMPLOYEE_ID = D.EMPLOYEE_ID
cont> ORDER BY LAST_NAME

OPTIMIZE USING句を使用してWOMENS_DEGREESアウトラインを指定すると、次の例に示すように、わずかに異なる問合せを実行する場合でも、Oracle Rdbでは、WOMENS_DEGREESアウトラインの使用が試行されます。


SQL> SELECT E.LAST_NAME, E.EMPLOYEE_ID, D.DEGREE, D.DEGREE_FIELD, D.YEAR_GIVEN
cont> FROM EMPLOYEES E, DEGREES D WHERE E.SEX = 'F'
cont> AND E.EMPLOYEE_ID = D.EMPLOYEE_ID
cont> ORDER BY LAST_NAME
cont> LIMIT TO 10 ROWS
cont> OPTIMIZE USING WOMENS_DEGREES;
~S: Outline WOMENS_DEGREES used  <-- the query uses the WOMENS_DEGREES outline
   .
   .
   .
 E.LAST_NAME      E.EMPLOYEE_ID   D.DEGREE   D.DEGREE_FIELD    D.YEAR_GIVEN
 Boyd             00244           MA         Elect. Engrg.             1982
 Boyd             00244           PhD        Applied Math              1979
 Brown            00287           BA         Arts                      1982
 Brown            00287           MA         Applied Math              1979
 Clarke           00188           BA         Arts                      1983
 Clarke           00188           MA         Applied Math              1976
 Clarke           00196           BA         Arts                      1978
 Clinton          00235           MA         Applied Math              1975
 Clinton          00201           BA         Arts                      1973
 Clinton          00201           MA         Applied Math              1978
10 rows selected

アウトラインの作成方法の詳細は、「CREATE OUTLINE文」を参照してください。

OPTIMIZE WITH

以前のOracle Rdbバージョンで使用されていたDEFAULT、行数が少ない方が選択されると仮定するAGGRESSIVE、問合せにリテラルを使用して索引で予備評価を行うSAMPLEDの3つの最適化制御のいずれかを選択します。

select-expr

SELECT式の詳細は、第2.8.1項を参照してください。

使用方法


例1: SELECT文の使用

次のSELECT文は、EMPLOYEES表のすべての行を不特定の順序で返します。


SQL> SELECT LAST_NAME, FIRST_NAME, MIDDLE_INITIAL FROM EMPLOYEES;
 LAST_NAME        FIRST_NAME   MIDDLE_INITIAL
 Toliver          Alvin        A
 Smith            Terry        D
 Dietrich         Rick         NULL
 Kilpatrick       Janet        NULL
   .
   .
   .
100 rows selected

例2: 選択した行のソートに使用するORDER BY句の追加

同じSELECT文にORDER BY句を追加すると、SQLはLAST_NAME句に基づいて行をソートします。


SQL> SELECT LAST_NAME, FIRST_NAME, MIDDLE_INITIAL FROM
cont> EMPLOYEES ORDER BY LAST_NAME;
 LAST_NAME        FIRST_NAME   MIDDLE_INITIAL
 Ames             Louie        A
 Andriola         Leslie       Q
 Babbin           Joseph       Y
 Bartlett         Dean         G
 Bartlett         Wes          NULL
   .
   .
   .
100 rows selected

例3: 一定数の行を返すLIMIT TO句の追加

1つのSELECT文でORDER BY句とLIMIT TO句の両方を使用すると、SQLは次の処理を行います。

  1. LAST_NAME句に従ってEMPLOYEES表のすべての行をソートします。

  2. 順序付けられたセットの最初の5行を返します。


SQL> SELECT LAST_NAME, FIRST_NAME, MIDDLE_INITIAL FROM
cont> EMPLOYEES ORDER BY LAST_NAME LIMIT TO 5 ROWS;
 LAST_NAME        FIRST_NAME   MIDDLE_INITIAL
 Ames             Louie        A
 Andriola         Leslie       Q
 Babbin           Joseph       Y
 Bartlett         Dean         G
 Bartlett         Wes          NULL
5 rows selected

例4: OPTIMIZE句を使用したアウトラインおよび問合せの名前の指定

次の選択問合せでは、事前に定義されたWOMENS_DEGREESと呼ばれるアウトラインが使用され、問合せにも同じ名前が付けられます。RDMS$DEBUG_FLAGS論理は"Ss"に設定されています。


SQL> SELECT E.LAST_NAME, E.EMPLOYEE_ID, D.DEGREE,
cont> D.DEGREE_FIELD, D.YEAR_GIVEN
cont>    FROM EMPLOYEES E, DEGREES D
cont>    WHERE E.SEX = 'F'
cont>       AND E.EMPLOYEE_ID = D.EMPLOYEE_ID
cont>    ORDER BY LAST_NAME
cont>    OPTIMIZE USING WOMENS_DEGREES
cont>             AS WOMENS_DEGREES;
~Query Name : WOMENS_DEGREES
~S: Outline WOMENS_DEGREES used
Sort
Cross block of 2 entries
  Cross block entry 1
    Conjunct        Get     Retrieval by index of relation EMPLOYEES
      Index name  EMP_EMPLOYEE_ID [0:0]
  Cross block entry 2
    Leaf#01 BgrOnly DEGREES Card=165
      BgrNdx1 DEG_EMP_ID [1:1] Fan=17
-- Rdb Generated Outline : 16-JUN-1994 11:01
create outline WOMENS_DEGREES
id 'D3A5BC351F507FED820EB704FC3F61E8'
mode 0
as (
  query (
    subquery (
      EMPLOYEES 0     access path index       EMP_EMPLOYEE_ID
        join by cross to
      DEGREES 1       access path index       DEG_EMP_ID
      )
    )
  )
compliance optional     ;
 E.LAST_NAME      E.EMPLOYEE_ID   D.DEGREE   D.DEGREE_FIELD    D.YEAR_GIVEN
 Boyd             00244           MA         Elect. Engrg.             1982
 Boyd             00244           PhD        Applied Math              1979
 Brown            00287           BA         Arts                      1982
 Brown            00287           MA         Applied Math              1979
 Clarke           00188           BA         Arts                      1983
 Clarke           00188           MA         Applied Math              1976
 Clarke           00196           BA         Arts                      1978
   .
   .
   .
61 rows selected

例5: 値式への編集文字列の関連付け


SQL> CREATE DOMAIN MONEY INTEGER(2)
cont> EDIT STRING '$$$,$$$,$$9.99';
SQL> --Calculate the average salary for all current jobs.
SQL> SELECT EMPLOYEE_ID,
cont> AVG(SALARY_AMOUNT) AS AVERAGE EDIT USING MONEY,
cont> MAX(SALARY_AMOUNT) AS MAXIMUM EDIT USING MONEY,
cont> MAX(SALARY_START) AS START_DATE EDIT USING 'YYYBDDBMMMBWWW'
cont> FROM SALARY_HISTORY
cont> WHERE SALARY_END IS NULL
cont> GROUP BY EMPLOYEE_ID;
 EMPLOYEE_ID          AVERAGE          MAXIMUM   START_DATE
 00164             $51,712.00       $51,712.00   983 14 Jan Fri
 00165             $11,676.00       $11,676.00   982  1 Jul Thu
 00166             $18,497.00       $18,497.00   982  7 Aug Sat
 00167             $17,510.00       $17,510.00   982 21 Aug Sat
   .
   .
   .
 00435             $84,147.00       $84,147.00   982 12 Mar Fri
 00471             $52,000.00       $52,000.00   982 15 Aug Sun
100 rows selected

例6: 値式を指定したORDER BY句の使用


SQL> SELECT * FROM EMPLOYEES
cont> ORDER BY EXTRACT (YEAR FROM BIRTHDAY),
cont>  TRIM(FIRST_NAME) || TRIM(LAST_NAME);
 00190         O'Sullivan       Rick         G.
   78 Mason Rd.                NULL                        Fremont
      NH      03044         M      12-Jan-1923   1             None
 00231         Clairmont        Rick         NULL
   92 Madiso7 Drive            NULL                        Chocorua
      NH      03817         M      23-Dec-1924   2             None
 00183         Nash             Walter       V.
   197 Lantern Lane            NULL                        Fremont
      NH      03044         M      19-Jan-1925   1             None
 00177         Kinmonth         Louis        NULL
   76 Maple St.                NULL                        Etna
      NH      03750         M       7-Apr-1926   1             None
 00240         Johnson          Bill         R.
   20 South St                 NULL                        Milford
      NH      03055         M      13-Apr-1927   2             None
   .
   .
   .

例7: 値式を指定したGROUP BY句の使用


SQL> SELECT COUNT (*), EXTRACT (YEAR FROM BIRTHDAY)
cont> FROM EMPLOYEES
cont> GROUP BY EXTRACT (YEAR FROM BIRTHDAY);
           1          1923
           1          1924
           1          1925
           1          1926
           4          1927


           2          1928
           1          1930
           2          1931
   .
   .
   .

例8: Oracleサーバーのスタイル構文を使用した外部結合の実行


SQL> SELECT EMPLOYEES.EMPLOYEE_ID, JOB_CODE
cont> FROM EMPLOYEES, CURRENT_JOB
cont> WHERE EMPLOYEES.EMPLOYEE_ID= CURRENT_JOB.EMPLOYEE_ID(+);
 EMPLOYEES.EMPLOYEE_ID   CURRENT_JOB.JOB_CODE
 00164                   DMGR
 00165                   ASCK
 00166                   DMGR
 00167                   APGM
 00168                   DMGR
 00169                   SPGM
 00170                   SCTR
 00171                   PRGM
   .
   .
   .