別のユーザーまたはロールのロールを取り消します。
REVOKE文は次の環境のロールで使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- 非ストアドSQLモジュールの非ストアド・プロシージャの一部として
- 動的SQLで動的に実行される文として
ALL ROLES
リストされたユーザーに割り当てられているロールをすべて取り消します。FROM username
FROM role-name
FROM PUBLIC
指定したロールが取り消されるユーザー、ロールまたはPUBLICユーザーを指定します。role-name
CREATE ROLE文で作成された、またはGRANT文で自動作成された既存のロールの名前です。
- ユーザーまたは別のロールのロールを取り消すには、データベースに対するSECURITY権限が必要です。
例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文は次を実行します。
- (WITH HOLDカーソルを除く)すべてのオープンなカーソルのクローズ
- すべての行ロックの解除
- チェックポイント操作の実行(高速コミット処理が有効な場合)
ROLLBACK文は次のものに反映されます。
- 現在のトランザクションに含まれる、すべてのオープンなデータベース
- SQLデータ操作文(DELETE、UPDATEおよびINSERT)を使用してデータに加えられたすべての変更
- SQLデータ定義文(ALTER、CREATE、DROP、RENAME、GRANTおよびREVOKE)を使用してデータ定義に加えられたすべての変更
ROLLBACK文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
AND CHAIN
ロールバックされたトランザクションと同じ属性を使用して、新規トランザクションを暗黙的に開始します。WORK
ROLLBACK文には影響のないオプション・キーワードを指定します。この引数は、ANSI/ISO SQL規格との互換性を目的としています。
- ROLLBACK文は、ATOMIC複合文では使用できません。
- AND CHAIN句は、複合文(BEGIN...ENDブロック)で、またはストアド・プロシージャの本体としてのみ使用できます。
- AND CHAINを使用している場合、新規トランザクションはロールバックされたトランザクションと同じ属性を使用して暗黙的に開始されます。READ WRITE、READ ONLY、RESERVING、EVALUATING、WAITおよびISOLATION LEVELなどの属性は、新規トランザクションについて保持されます。
- 複合トランザクションの属性を指定するのは1回のみであるため、このAND CHAIN句を使用してアプリケーションを簡易化できます。
- SET FLAGSオプションのTRANSACTION_PARAMETERSが指定されると、ロールバックされたトランザクションと連鎖トランザクションを識別するために一連の出力が書き込まれます。SET TRANSACTIONはそれぞれ、各トランザクション・アクション行の後に表示される一意の順序番号を割り当てます。
- ROLLBACK文が複合文内で実行され、トランザクションがアクティブでない場合、結果として、ステータスは成功(SQLSTATEまたはSQLCODE)になります。
ただし、ROLLBACK文が単一文で実行される場合はエラーになります。この動作は、言語をSQL92またはSQL99に設定するか、SET QUIET COMMIT文を使用して変更できます。詳細は、「SET DIALECT文」および「SET QUIET COMMIT文」を参照してください。SQLモジュール言語またはSQLプリコンパイラ・アプリケーションについては、モジュール・ヘッダーのQUIET_COMMIT修飾子およびQUIET COMMIT句を参照してください。
例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>
結果表を指定します。結果表は、選択式によって指定された条件を満たしている、1つ以上の表またはビューの列と行から導出された値の中間表です。これらの列と行が属する表またはビューは、SELECT文のFROM句で識別されます。SELECT文の基本要素を選択式と呼びます。選択式の詳細は、第2.8.1項を参照してください。
ホスト言語プログラムの結果表の行を取得するには、DECLARE CURSOR文を使用するか、またはシングルトン選択と呼ばれる特殊な形式のSELECT文を使用する必要があります。シングルトン選択の詳細は、「SELECT文: シングルトン選択」を参照してください。
SQLでは、SELECT文の句は次の順序で評価されます。
- FROM
- WHERE
- GROUP BY
- HAVING
- 選択リスト
- ORDER BY
- LIMIT TO
- 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句を指定する必要はありません。
- 列名を含むFOR UPDATE句を指定して、後でFOR UPDATE句にない列をUPDATE文で指定した場合、警告メッセージが発行され、更新変更が続行されます。
- FOR UPDATE句を指定して列名を指定しない場合は、UPDATE文を使用して任意の列を更新できます。この場合、メッセージは表示されません。
- FOR UPDATE句を指定しない場合は、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
選択式を指定する文に対して優先するオプティマイザ計画を指定します。次のオプションを使用できます。
- FAST FIRST
FAST FIRST用に最適化された問合せが、これにより全体のスループットが低下しても、できるかぎり速やかにデータをユーザーに返します。
問合せが早期に取り消されることがある場合は、FAST FIRSTの最適化を指定する必要があります。FAST FIRST最適化の有力な候補は、レコードのグループをユーザーに表示する対話型アプリケーションです。このようなアプリケーションでは、ユーザーは最初の数画面の確認後、問合せを中断することもできます。たとえば、シングルトンSELECT文では、FAST FIRST最適化がデフォルトで設定されます。
最適化レベルを明示的に設定しない場合は、FAST FIRSTがデフォルトとなります。- TOTAL TIME
アプリケーションをバッチで実行し、問合せのすべてのレコードにアクセスして更新またはレポートの書込みを行う場合は、TOTAL TIME最適化を指定する必要があります。TOTAL TIME最適化は、ほとんどの問合せに効果があります。
次の例は、優先される最適化モードを設定するためのDECLARE CURSOR構文を示しています。
SQL> DECLARE TEMP1 TABLE CURSOR cont> FOR cont> SELECT * cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID > '00400' cont> OPTIMIZE FOR FAST FIRST; SQL> -- SQL> DECLARE TEMP2 TABLE CURSOR cont> FOR cont> SELECT LAST_NAME, FIRST_NAME cont> FROM EMPLOYEES cont> ORDER BY LAST_NAME cont> OPTIMIZE FOR TOTAL TIME;
- SEQUENTIAL ACCESS
順次アクセスの使用を強制します。このオプションは、厳密なパーティション化機能を使用する表では特に有用です。
表の記憶域マップの属性がPARTITIONING IS NOT UPDATABLEの場合、記憶域へのデータのマッピングは厳密に守られます。これは厳密なパーティション化と呼ばれます。このような表に対する問合せで順次アクセスを行うと、オプティマイザでは、すべてのパーティションがスキャンされるのではなく、WHERE制限と一致しないパーティションが除外されます。
次の例は、選択した行を特定のパーティションから削除する問合せを示しています。この表には、オプティマイザで選択される可能性のある索引もいくつか含まれています。このため、OPTIMIZE句によって順次アクセスが強制的に行われます。
SQL> delete from PARTS_LOG cont> where parts_id between 10000 and 20000 cont> and expire_date < :purge_date cont> optimize for sequential access;
このような問合せで行われるアクセスはすべて順次アクセスです。索引アクセスを使用する同様の問合せを比較して、使用中のI/Oが受け入れられるかに注意します。
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項を参照してください。
- アウトラインが存在する場合は、OPTIMIZE USING句で指定されているアウトラインが使用されます。ただし、アウトラインのディレクティブを1つ以上順守できない場合は除きます。たとえば、アウトラインの準拠レベルが必須で、アウトラインのディレクティブで指定されている索引の1つが削除された場合、そのアウトラインは使用されません。既存のアウトラインを使用できない場合は、エラー・メッセージが発行されます。
存在しないアウトラインの名前を指定すると、問合せがコンパイルされ、そのアウトライン名は無視され、問合せと同じアウトラインIDを持つ既存のアウトラインが検索されます。同じアウトラインIDのアウトラインが検出されると、そのアウトラインのディレクティブを使用して問合せを実行しようとします。同じアウトラインIDを持つアウトラインが検出されない場合、問合せ実行のための計画がオプティマイザで選択されます。
問合せアウトラインの詳細は、『Oracle Rdb7 Guide to Database Performance and Tuning』を参照してください。
例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は次の処理を行います。
- LAST_NAME句に従ってEMPLOYEES表のすべての行をソートします。
- 順序付けられたセットの最初の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 . . .