事前に定義されていない保持可能カーソルのセッションのデフォルト属性を指定します。
SET HOLD CURSORS文は次の環境で使用できます。
- 対話型SQL内
- 動的カーソルの動作を変更するためにプリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
variable
string-literal
保持可能カーソルの属性を指定します。次の値があります。
- ON COMMIT
WITH HOLD句なしで宣言されたカーソルまたはWITH HOLD ON COMMIT句を使用して宣言されたカーソルはすべてコミット時にオープンのままになります。- ON ROLLBACK
WITH HOLD句なしで宣言されたカーソルまたはWITH HOLD ON ROLLBACK句を使用して宣言されたカーソルはすべてロールバック時にオープンのままになります。- ALL
WITH HOLD句を使用して宣言されたカーソルを除くすべてのカーソルはオープンのままになります。
- NONE
WITH HOLD句を使用して宣言されたカーソルを除くすべてのカーソルはクローズされます。
SET HOLD CURSORS文を指定しない場合、これがデフォルトとなります。
- SET HOLD CURSORS文の前に定義されたカーソルには影響しません。
- string-literalは、一重引用符(')で囲む必要があります。
例1: 保持可能カーソルのセッションのデフォルト属性の設定
SQL> ATTACH 'FILENAME mf_personnel'; SQL> -- SQL> -- Define the session default SQL> -- SQL> SET HOLD CURSORS 'ON ROLLBACK'; SQL> -- SQL> -- Declare the cursor SQL> -- SQL> DECLARE curs1 CURSOR FOR cont> SELECT first_name, last_name FROM employees; SQL> OPEN curs1; SQL> FETCH curs1; FIRST_NAME LAST_NAME Terry Smith SQL> FETCH curs1; FIRST_NAME LAST_NAME Rick O'Sullivan SQL> DELETE FROM employees WHERE CURRENT OF curs1; 1 row deleted SQL> ROLLBACK; SQL> FETCH curs1; FIRST_NAME LAST_NAME Stan Lasch SQL> COMMIT; SQL> FETCH curs1; %SQL-F-CURNOTOPE, Cursor CURS1 is not opened
例2: 保持可能カーソルのセッションのデフォルト属性のオーバーライド
SQL> -- Set the session default SQL> -- SQL> SET HOLD CURSORS 'ALL'; SQL> -- SQL> -- Declare the cursor without a WITH HOLD clause SQL> -- SQL> DECLARE curs2 CURSOR FOR cont> SELECT first_name, last_name FROM employees; SQL> OPEN curs2; SQL> FETCH curs2; FIRST_NAME LAST_NAME Terry Smith SQL> FETCH curs2; FIRST_NAME LAST_NAME Rick O'Sullivan SQL> ROLLBACK; SQL> FETCH curs2; FIRST_NAME LAST_NAME Stan Lasch SQL> COMMIT; SQL> FETCH curs2; FIRST_NAME LAST_NAME Susan Gray SQL> CLOSE curs2; SQL> FETCH curs2; %SQL-F-CURNOTOPE, Cursor CURS2 is not opened SQL> -- SQL> -- Declare the cursor overriding the session default by SQL> -- specifying the WITH HOLD clause SQL> -- SQL> DECLARE curs3 CURSOR cont> WITH HOLD PRESERVE ON COMMIT cont> FOR SELECT first_name, last_name FROM employees; SQL> OPEN curs3; SQL> FETCH curs3; FIRST_NAME LAST_NAME Terry Smith SQL> FETCH curs3; FIRST_NAME LAST_NAME Rick O'Sullivan SQL> COMMIT; SQL> FETCH curs3; FIRST_NAME LAST_NAME Stan Lasch SQL> ROLLBACK; SQL> FETCH curs3; %SQL-F-CURNOTOPE, Cursor CURS3 is not opened
モジュールまたは対話型SQLセッションの識別子キャラクタ・セットを指定します。
SET IDENTIFIER CHARACTER SET文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
表名および列名など、データベース・オブジェクト名に使用されるキャラクタ・セットを指定します。runtime-optionsの値は有効なキャラクタ・セットである必要があります。使用可能なキャラクタ・セットおよびオプション値のリストは、第2.1.5項を参照してください。
parameter parameter-marker
- SET IDENTIFIER CHARACTER SET文により、セッションの識別子キャラクタ・セットを設定します。
- 指定した識別子キャラクタ・セットには、ASCII文字が含まれている必要があります。使用可能なキャラクタ・セットのリストは、第2.1.5項を参照してください。
- 言語をSQL99またはMIAに設定し、データベースの作成時に識別子キャラクタ・セットを指定しない場合、セッションの識別子キャラクタ・セットが使用されます。それ以外の場合は、データベースの識別子キャラクタ・セットとしてDEC_MCSが使用されます。
- セッションの識別子キャラクタ・セットは、アタッチされているすべてのデータベースの識別子キャラクタ・セットと一致する必要があります。
- 識別子キャラクタ・セットにより、明示的なデータベースのコンテキストを持たない文のSQLDAおよびSQLDA2にあるSQLNAMEフィールドのキャラクタ・セットも指定されます。
- SHOW CHARACTER SETS文を使用して、現行セッションのキャラクタ・セットを表示します。
SQLモジュール言語およびプリコンパイルされたSQLにおけるモジュールのキャラクタ・セットの設定の詳細は、第3.2節および「DECLARE MODULE文」を参照してください。
例1: 対話型セッションの識別子キャラクタ・セットの設定
SQL> show character sets; Default character set is DEC_KANJI National character set is DEC_KANJI Identifier character set is SHIFT_JIS Literal character set is SHIFT_JIS Display character set is SHIFT_JIS SQL> set identifier character set 'DEC_KANJI'; SQL> show character sets; Default character set is DEC_KANJI National character set is DEC_KANJI Identifier character set is DEC_KANJI Literal character set is SHIFT_JIS Display character set is SHIFT_JIS
現在のアタッチで識別子をキーワードとして使用可能かどうかを指定します。
SET KEYWORD RULES文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
次のいずれかにする必要があるruntime-optionsの値を指定します。
parameter parameter-marker
- SQL99
- SQL92
- SQL89
- MIA
- SQLV40
他のすべてのオプションでは、識別子としてキーワードを使用することは強制的に拒否されます。動作の相違を確認するには、例を参照してください。
- SET DIALECT文がSET KEYWORD RULES文の後に処理される場合、これにより、SET KEYWORD RULES文の設定がオーバーライドされます。
- SET KEYWORD RULES文により、引用ルールが暗黙的に設定されます。SET QUOTING RULES文がSET KEYWORD RULES文の後に処理される場合、これにより、SET KEYWORD RULES文によって暗黙的に設定された引用ルールがオーバーライドされます。
- SET KEYWORD RULES文がSET QUOTING RULES文の後に処理される場合、これにより、SET QUOTING RULES文によって設定された引用ルールがオーバーライドされます。
- SET KEYWORD RULES文を指定すると、現在のアタッチにのみ関するキーワードおよび引用ルールが変更されます。SHOW CONNECTIONS文を使用して、アタッチの特性を表示します。
例1: SQL99へのキーワード・ルール特性の設定
SQL> SET KEYWORD RULES 'SQL99'; SQL> -- SQL> -- Because NATIONAL is a keyword, SQL returns an error message. SQL> -- SQL> CREATE DOMAIN NATIONAL CHAR (2); %SQL-F-RES_WORD_AS_IDE, Keyword NATIONAL used as an identifier SQL> -- SQL> -- Enclose NATIONAL in double quotation marks. SQL> -- SQL> CREATE DOMAIN "NATIONAL" CHAR (2); SQL> --
例2: SQLV40へのキーワード・ルール特性の設定
SQL> SET KEYWORD RULES 'SQLV40'; SQL> -- SQL> -- You can use a keyword as an identifier. SQL> -- SQL> CREATE DOMAIN NATIONAL CHAR (2); %SQL-I-DEPR_FEATURE, Deprecated Feature: Keyword national used as an identifier SQL> --
モジュールまたは対話型SQLセッションのリテラル・キャラクタ・セットを指定します。
SET LITERAL CHARACTER SET文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
キャラクタ・セットまたは各国語キャラクタ・セットによって修飾されないリテラルのキャラクタ・セットを指定します。runtime-optionsの値は有効なキャラクタ・セットである必要があります。使用可能なキャラクタ・セットとオプション値のリストは、第2.1節を参照してください。
parameter parameter-marker
- SET LITERAL CHARACTER SET文により、セッションのリテラル・キャラクタ・セットを設定します。
- 言語をMIAに設定する場合、リテラル・キャラクタ・セットはKATAKANAです。それ以外の場合、言語を設定しないかリテラル・キャラクタ・セットを変更しない場合、DEC_MCSが使用されます。
- SHOW CHARACTER SETS文を使用して、現行セッションのキャラクタ・セットを表示します。
例1: 対話型セッションのリテラル・キャラクタ・セットの設定
SQL> show character sets; Default character set is DEC_KANJI National character set is DEC_KANJI Identifier character set is DEC_KANJI Literal character set is SHIFT_JIS Display character set is SHIFT_JIS SQL> set literal character set 'DEC_KANJI'; SQL> show character sets; Default character set is DEC_KANJI National character set is DEC_KANJI Identifier character set is DEC_KANJI Literal character set is DEC_KANJI Display character set is SHIFT_JIS
セッションのデフォルト・キャラクタ・セット、識別子キャラクタ・セットおよびリテラル・キャラクタ・セットを指定します。SET NAMES文では、SQLモジュール言語の文字パラメータも指定されます。
SET NAMES文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
セッションのデフォルト・キャラクタ・セット、識別子キャラクタ・セットおよびリテラル・キャラクタ・セットに使用されるキャラクタ・セットを指定します。runtime-optionsの値は有効なキャラクタ・セットである必要があります。使用可能なキャラクタ・セットおよびオプション値のリストは、第2.1.5項を参照してください。
parameter parameter-marker
- SET NAMES文により、セッションのデフォルト・キャラクタ・セット、識別子キャラクタ・セットおよびリテラル・キャラクタ・セットが設定され、以前の変更がオーバーライドされます。SET NAMES文で指定したキャラクタ・セットとは異なる識別子キャラクタ・セット、デフォルト・キャラクタ・セットおよびリテラル・キャラクタ・セットを使用するには、SET NAMES文を発行した後にこれらを指定します。
- 指定したキャラクタ・セットには、ASCII文字が含まれている必要があります。使用可能なキャラクタ・セットのリストは、第2.1.5項を参照してください。
- SET NAMES文により、明示的なデータベースのコンテキストを持たない文のSQLDAおよびSQLDA2にあるSQLNAMEフィールドのキャラクタ・セットも指定されます。
- SHOW CHARACTER SETS文を使用して、現行セッションのキャラクタ・セットを表示します。
SQLモジュール言語およびプリコンパイルされたSQLにおけるモジュールのキャラクタ・セットの設定の詳細は、第3.2節および「DECLARE MODULE文」を参照してください。
例1: 対話型セッションのデフォルト・キャラクタ・セット、識別子キャラクタ・セットおよびリテラル・キャラクタ・セットの設定
SQL> show character sets; Default character set is DEC_MCS National character set is DEC_MCS Identifier character set is DEC_MCS Literal character set is DEC_MCS Display character set is UNSPECIFIED SQL> -- SQL> set names 'DEC_KANJI'; SQL> show character sets; Default character set is DEC_KANJI National character set is DEC_MCS Identifier character set is DEC_KANJI Literal character set is DEC_KANJI Display character set is UNSPECIFIED SQL> -- SQL> -- Specifying a different default character set SQL> -- SQL> set default character set 'DEC_KOREAN'; SQL> show character sets; Default character set is DEC_KOREAN National character set is DEC_MCS Identifier character set is DEC_KANJI Literal character set is DEC_KANJI Display character set is UNSPECIFIED SQL>
モジュールまたは対話型SQLセッションの各国語キャラクタ・セットを指定します。
SET NATIONAL CHARACTER SET文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
セッションの各国語キャラクタ・セットを指定します。runtime-optionsの値は有効なキャラクタ・セットである必要があります。使用可能なキャラクタ・セット名およびオプション値のリストは、第2.1節を参照してください。
parameter parameter-marker
- SET NATIONAL CHARACTER SET文により、セッションの各国語キャラクタ・セットを設定します。
- 各国語キャラクタ・セットにより、各国語キャラクタ・セット、NCHARおよびNCHAR VARYINGによって修飾される文字列リテラルのキャラクタ・セットが決まります。データベースの各国語キャラクタ・セット用として使用可能なキャラクタ・セットについては、第2.1節を参照してください。
- 言語をSQL99またはMIAに設定し、データベースの作成時に各国語キャラクタ・セットを指定しない場合、セッションの各国語キャラクタ・セットが使用されます。それ以外の場合は、各国語キャラクタ・セットとしてDEC_MCSが使用されます。
- SHOW CHARACTER SETS文を使用して、現行セッションのキャラクタ・セットを表示します。
SQLモジュール言語およびプリコンパイルされたSQLにおけるモジュールのキャラクタ・セットの設定の詳細は、第3.2節および「DECLARE MODULE文」を参照してください。
例1: 対話型セッションの各国語キャラクタ・セットの設定
SQL> show character sets; Default character set is DEC_KANJI National character set is DEC_MCS Identifier character set is SHIFT_JIS Literal character set is SHIFT_JIS Display character set is SHIFT_JIS SQL> set national character set 'DEC_KANJI'; SQL> show character sets; Default character set is DEC_KANJI National character set is DEC_KANJI Identifier character set is SHIFT_JIS Literal character set is SHIFT_JIS Display character set is SHIFT_JIS
問合せの最適化特性に現在のセッションのデフォルトを指定できるようにします。この文では、DEFAULTを使用してセッションのデフォルトをリセットしたり、SELECTIVITYまたはFAST FIRSTまたはTOTAL TIME最適化に対して1つ以上のキーワードを指定することが可能です。
この文は、対話型SQLにおける後続のすべての問合せコンパイルや、動的SQLを使用して指定した問合せに影響します。
SET OPTIMIZATION LEVEL文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- 動的SQLで動的に実行される文として
optimization-level
セッションのデフォルトをリセットするために使用するオプティマイザ計画を指定します。渡される文字列またはパラメータ値は、書式設定されたキーワード値のリストである必要があります。次のオプションから選択できます。
- AGGRESSIVE SELECTIVITYオプション: 選択する行数が少ないと想定される場合。
- DEFAULTオプション: Oracle RdbのデフォルトであるFAST FIRSTおよびDEFAULT SELECTIVITYを受け入れる場合。
- FAST FIRSTオプション: これにより全体のスループットが低下しても、できるかぎり速やかにデータをユーザーに返す場合。
- SAMPLED SELECTIVITYオプション: 問合せでリテラルを使用して索引に関する予備評価を実行する場合。
- TOTAL TIMEオプション: プログラムを最高速度で実行し、すべてのデータをできるかぎり速やかに返す場合。アプリケーションがバッチで実行され、問合せ内のすべてのレコードがアクセスされ、レポートの更新または書込みが行われる場合、TOTAL TIMEを指定する必要があります。
TOTAL TIMEオプションまたはFAST FIRSTオプションの1つのみを選択できます。AGGRESSIVE SELECTIVITYオプションまたはSAMPLED SELECTIVITYオプションの1つのみを選択できます。キーワードを区切るにはカンマを使用し、リストは丸カッコで囲みます。DEFAULTが選択されている場合、他のオプションを含めることはできません。
'string-literal'
カンマで区切ったキーワードのリストである必要があるruntime-optionsの値を指定します。
parameter parameter-marker
- 最も一般に使用される最適化レベルを初期化プロシージャ(各セッションの開始時に自動的に実行されるSQLINI.SQLプロシージャ)に設定できます。
- UPDATE文、INSERT文、DELETE文またはSELECT文のOPTIMIZE句を指定することにより、特定の問合せの最適化レベルを変更できます(Oracle Rdbの以前のバージョンと同じカーソルについてのみではありません)。
- OPTIMIZE WITH句またはOPTIMIZE FOR句が明示的に含まれる問合せは、SET OPTIMIZATION LEVELコマンドを使用して確立された設定の影響は受けません。
例1: 最適化レベルの設定次の例では、問合せを実行する前にRDMS$DEBUG_FLAGS論理名をSTRATEGYに定義することが重要です。
SQL> ATTACH 'FILENAME personnel'; SQL> -- SQL> -- No optimization level has been selected. The optimizer SQL> -- selects the fast-first (FFirst) retrieval strategy to SQL> -- retrieve the rows from the EMPLOYEES table in the SQL> -- following query: SQL> -- SQL> SELECT EMPLOYEE_ID, LAST_NAME cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID IN ('00167', '00168'); Leaf#01 FFirst RDB$RELATIONS Card=19 BgrNdx1 RDB$REL_REL_NAME_NDX [1:1] Fan=8 Sort Cross block of 2 entries Cross block entry 1 Leaf#01 BgrOnly RDB$RELATION_FIELDS Card=71 BgrNdx1 RDB$RFR_REL_NAME_FLD_ID_NDX [1:1] Fan=8 Cross block entry 2 Get Retrieval by index of relation RDB$FIELDS Index name RDB$FIELDS_NAME_NDX [1:1] Direct lookup Leaf#01 FFirst EMPLOYEES Card=100 BgrNdx1 EMP_EMPLOYEE_ID [1:1...]2 Fan=17 EMPLOYEE_ID LAST_NAME 00167 Kilpatrick 00168 Nash 2 rows selected SQL> -- SQL> -- Use the SET OPTIMIZATION LEVEL statement to specify that SQL> -- you want the total-time (BgrOnly) retrieval strategy to SQL> -- be used. Note that when the previous query is executed SQL> -- again, the total-time (BgrOnly) retrieval strategy is SQL> -- selected, instead of fast-first. SQL> -- SQL> SET OPTIMIZATION LEVEL 'TOTAL TIME'; SQL> SELECT EMPLOYEE_ID, LAST_NAME cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID IN ('00167', '00168'); Leaf#01 BgrOnly EMPLOYEES Card=100 BgrNdx1 EMP_EMPLOYEE_ID [1:1...]2 Fan=17 EMPLOYEE_ID LAST_NAME 00167 Kilpatrick 00168 Nash 2 rows selected SQL> -- SQL> -- When the SET OPTIMIZATION LEVEL 'DEFAULT' statement SQL> -- is specified, either the fast-first or total-time SQL> -- strategy will be selected. The fast-first strategy SQL> -- will be tried first, then total-time will be selected SQL> -- if it will retrieve the rows faster than the fast-first SQL> -- strategy. SQL> -- SQL> SET OPTIMIZATION LEVEL 'DEFAULT'; SQL> -- SQL> -- Because the fast-first strategy is faster than the SQL> -- total-time strategy for this query, the fast-first SQL> -- stragegy is used to retrieve the rows. SQL> -- SQL> SELECT EMPLOYEE_ID, LAST_NAME cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID IN ('00167', '00168'); Leaf#01 FFirst EMPLOYEES Card=100 BgrNdx1 EMP_EMPLOYEE_ID [1:1...]2 Fan=17 EMPLOYEE_ID LAST_NAME 00167 Kilpatrick 00168 Nash 2 rows selected
例2: sampled selectivityの使用
この例は、問合せのコンパイル前におけるSET OPTIMIZATION LEVELコマンドの使用とその結果としてのEstimの使用を示しています。推定(34行)は、最終的な結果である37行に非常に近くなっています。
SQL> set flags 'strategy,detail,execution'; SQL> set optimization level 'total time, sampled selectivity'; SQL> select * from employees where employee_id between '00000' and '00200'; ~Estim EMP_EMPLOYEE_ID Sorted: Split lev=2, Seps=2 Est=34 ~Estim EMP_EMPLOYEE_ID Sorted: Split lev=2, Seps=2 Est=34 ~S#0005 Tables: 0 = EMPLOYEES Leaf#01 BgrOnly 0:EMPLOYEES Card=100 Bool: (0.EMPLOYEE_ID >= '00000' AND (0.EMPLOYEE_ID <= '00200') BgrNdx1 EMP_EMPLOYEE_ID [1:1] Fan=17 Keys: (0:EMPLOYEE_ID >= '00000') AND 0.EMPLOYEE_ID <= '00200') ~Estim EMP_EMPLOYEE_ID Sorted: Split lev=2, Seps=1 Est=17 ~E#0005.01(1) Estim Index/Estimate 1/17 ~E#0005.01(1) Bgrndx1 EofData DBKeys=37 Fetches=0+0 RecsOut=0 #Bufs=30 EMPLOYEE_ID LAST_NAME FIRST_NAME MIDDLE_INITIAL ADDRESS_DATA1 ADRESS_DATA_2 CITY STATE POSTAL_CODE SEX BIRTHDAY STATUS_CODE 00190 O'Sullivan Rick G. 78 Mason Rd. NULL Fremont NH 03044 M 12-Jan-1923 1 . . . ~E#005.01(1) Fin Buf DBKeys=37 Fetches=0+32 RecsOut=37 00174 Myotte Daniel V. 95 Princeton Rd. NULL Bennington MA 03442 M 17-Jan-1948 1 37 rows selected SQL>