文字列パラメータ、列、ドメインおよびオフセットの長さを文字またはオクテットのどちらで解釈するかを指定します。(オクテットとは、8ビットの集まりです。)
SET CHARACTER LENGTH文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
次のいずれかにする必要があるruntime-optionsの値を指定します。
parameter parameter-marker
- OCTETS
- CHARACTERS
CHARACTERSは、文字列パラメータ、列、ドメインおよびオフセットの長さを文字として解釈するように指定します。
OCTETSは、文字列パラメータ、列、ドメインおよびオフセットの長さをオクテットとして解釈するように指定します。
- SET DIALECT文がSET CHARACTER LENGTH文の後に処理される場合、これにより、SET CHARACTER LENGTH文の設定がオーバーライドされる場合があります。
- CHARACTER LENGTHがOCTETSに設定され、複数のオクテットのキャラクタ・セットを使用する場合は、パラメータ、列およびドメインの適切なサイズを指定する必要があります。
- SHOW CONNECTIONS CURRENT文を使用して、セッションの文字長の現在の設定を表示します。
例1: 文字長のオクテットへの設定
SQL> set character length 'octets'; SQL> show connection current; Connection: RDB$DEFAULT_CONNECTION Default alias is RDB$DBHANDLE Default catalog name is RDB$CATALOG Default schema name is SMITH Dialect: SQLV40 Default character unit: OCTETS Keyword Rules: SQLV40 View Rules: SQLV40 Default DATE type: DATE VMS Quoting Rules: SQLV40 Optimization Level: DEFAULT Hold Cursors default: WITH HOLD PRESERVE NONE Quiet commit mode: OFF Compound transactions mode: EXTERNAL 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 Alias RDB$DBHANDLE: Identifier character set is DEC_MCS Default character set is DEC_MCS National character set is DEC_MCS SQL> /* ***> Create two domains: one uses LATIN9, a single-octet character ***> set, and one uses KANJI a fixed multi-octet character set. ***> */ SQL> create domain LATIN9_DOM char(8) character set ISOLATIN9; SQL> create domain KANJI_DOM char(5) character set KANJI; %SQL-F-CHRUNIBAD, Number of octets is not an integral number of characters SQL> /* ***> Because KANJI is a fixed multi-octet character set, using two ***> octets for each character, you must specify the size as a ***> multiple of two. ***> */ SQL> create domain KANJI_DOM char(8) character set KANJI; SQL> show domains; User domains in database with filename MIA_CHAR_SET KANJI_DOM CHAR(8) KANJI 4 Characters, 8 Octets LATIN9_DOM CHAR(8) ISOLATIN9 8 Characters, 8 Octets SQL>
例2: 文字長の文字への設定
SQL> set character length 'characters'; SQL> show connection current; Connection: RDB$DEFAULT_CONNECTION Default alias is RDB$DBHANDLE Default catalog name is RDB$CATALOG Default schema name is SMITH Dialect: SQLV40 Default character unit: CHARACTERS Keyword Rules: SQLV40 View Rules: SQLV40 Default DATE type: DATE VMS Quoting Rules: SQLV40 Optimization Level: DEFAULT Hold Cursors default: WITH HOLD PRESERVE NONE Quiet commit mode: OFF Compound transactions mode: EXTERNAL 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 Alias RDB$DBHANDLE: Identifier character set is DEC_MCS Default character set is DEC_MCS National character set is DEC_MCS SQL> /* ***> Create two domains: one uses LATIN9, a single-octet character ***> set, and one uses KANJI a fixed multi-octet character set. ***> */ SQL> create domain LATIN9_DOM char(8) character set ISOLATIN9; SQL> create domain KANJI_DOM char(5) character set KANJI; SQL> show domains; User domains in database with filename MIA_CHAR_SET KANJI_DOM CHAR(5) KANJI 5 Characters, 10 Octets LATIN9_DOM CHAR(8) ISOLATIN9 8 Characters, 8 Octets SQL>
複合文のデフォルトのトランザクション開始時におけるSQLの動作を制御できます。デフォルトでは、現在のトランザクションが存在しない場合、複合文またはストアド・プロシージャを実行する前にトランザクションが開始されます。ただし、この場合はプロシージャ内のアクションと競合するおそれがあります。また、プロシージャの本体がデータベース・アクセスを実行しない場合は、トランザクションを理由もなく開始することになります。このデフォルト設定は、プロシージャのトランザクション開始を想定する必要のあるアプリケーションとの下位互換性のために保持されています。
SET COMPOUND TRANSACTIONS文は次の環境で使用できます。
- 対話型SQL内
- 動的SQLで動的に実行される文として
int-ext-value
キーワード'INTERNAL'または'EXTERNAL'を含む文字列リテラルまたはホスト変数です。これらのキーワードでは大/小文字が区別されません(大文字、小文字、または大/小文字の混在が可能)。値をEXTERNALに設定すると、プロシージャの実行前にトランザクションが開始されます。値をINTERNALに設定すると、プロシージャにより、プロシージャの実行に必要とされるトランザクションが必要に応じて開始されます。
- SQLモジュール言語またはSQLプリコンパイラのヘッダーでは、COMPOUND TRANSACTIONSオプションを使用して、プロシージャのトランザクションの開始を有効または無効にできます。この機能を有効または無効にするには、キーワードINTERNALまたはEXTERNALを使用する必要があります。
MODULE TXN_CONTROL LANGUAGE BASIC PARAMETER COLONS COMPOUND TRANSACTIONS INTERNAL PROCEDURE S_TXN (SQLCODE); BEGIN SET TRANSACTION READ WRITE; END; PROCEDURE C_TXN (SQLCODE); BEGIN COMMIT; END;
例1: トランザクション開始の有効化と無効化
対話型SQLまたは動的SQLでは、次のSETコマンドを使用して、SQLインタフェースによるトランザクションの開始を有効または無効にできます。SETコマンドのパラメータは、キーワード'INTERNAL'または'EXTERNAL'を含む文字列リテラルまたはホスト変数です。
SQL> SET COMPOUND TRANSACTIONS 'internal'; SQL> CALL START_TXN_AND_COMMIT (); SQL> SET COMPOUND TRANSACTIONS 'external'; SQL> CALL UPDATE_EMPLOYEES (...);
使用可能な接続の中から名前付きの接続を選択し、現在の接続を一時停止してそのコンテキストを保存します。さらに、その名前付きの接続をSET CONNECT文の実行後にアプリケーションの後続プロシージャで使用します。接続の作成と名前付けの詳細は、「CONNECT文」を参照してください。
SET CONNECT文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
connection-name
アタッチされるデータベースのグループ(環境)とそれらを参照するデータベースおよびリクエスト・ハンドル(接続)の間の関連に対する名前を指定します。接続名は次のように指定できます。
- 一重引用符で囲まれた文字列リテラル
- (モジュール言語の)パラメータ
- (プリコンパイルされたSQLの)変数
DEFAULT
一単位としてアタッチする1つ以上のデータベースを指定します。デフォルト接続を指定するにはDEFAULTキーワードを使用します。デフォルト接続とは、対話的にアタッチされたすべてのデータベース、またはDECLARE ALIAS文によってコンパイル時にモジュールで認識されるすべてのデータベースです。
SQLに認識されない接続名を指定すると、エラー・メッセージが表示され、接続状態は変更されません。
例1: デフォルト接続および他の2つの接続の作成対話型SQL接続の次のログ・ファイルは、personnel_northwest、personnel_northeastおよびpersonnel_southeastの3つのデータベース・アタッチを示しています。(personnel_northwestの別名を指定しないことにより、デフォルトの別名が割り当てられています。)EAST_COASTを含む、いくつかの接続が確立されます。EAST_COASTには、personnel_northeastとpersonnel_southeastの両方が含まれます。
SHOW DATABASE文を使用してデータベース設定を表示します。
SQL> -- SQL> -- Attach to the personnel_northwest and personnel_northeast databases. SQL> -- personnel_northwest has the default alias, so personnel_northeast SQL> -- requires an alias. SQL> -- All the attached databases comprise the default connection. SQL> -- SQL> ATTACH 'FILENAME personnel_northwest'; SQL> ATTACH 'ALIAS NORTHEAST FILENAME personnel_northeast'; SQL> -- SQL> -- Add the personnel_southeast database. SQL> -- SQL> ATTACH 'ALIAS SOUTHEAST FILENAME personnel_southeast'; SQL> -- SQL> -- Connect to personnel_southeast. CONNECT does an SQL> -- implicit SET CONNECT to the newly created connection. SQL> -- SQL> CONNECT TO 'ALIAS SOUTHEAST FILENAME personnel_southeast' cont> AS 'SOUTHEAST_CONNECTION'; SQL> -- SQL> -- Connect to both personnel_southeast and personnel_northeast as SQL> -- EAST_COAST connection. SQL replaces the current connection to SQL> -- the personnel_southeast database with the EAST_COAST connection SQL> -- when you issue the CONNECT statement. You now have two different SQL> -- connections that include personnel_southeast. SQL> -- SQL> CONNECT TO 'ALIAS NORTHEAST FILENAME personnel_northeast, cont> ALIAS SOUTHEAST FILENAME personnel_southeast' cont> AS 'EAST_COAST'; SQL> -- SQL> -- The DEFAULT connection still includes all the attached databases. SQL> -- SQL> SET CONNECT DEFAULT; SQL> -- SQL> -- DISCONNECT releases the connection name EAST_COAST, but SQL> -- does not detach from the EAST_COAST databases because SQL> -- they are also part of the default connection. SQL> -- SQL> DISCONNECT 'EAST_COAST'; SQL> -- SQL> SET CONNECT 'EAST_COAST'; %SQL-F-NOSUCHCON, There is not an active connection by that name SQL> -- SQL> -- If you disconnect from the default connection, and have no other SQL> -- current connections, you are no longer attached to any databases. SQL> -- SQL> DISCONNECT DEFAULT; SQL> SHOW DATABASES; %SQL-F-ERRATTDEF, Could not use database file specified by SQL$DATABASE -RDB-E-BAD_DB_FORMAT, SQL$DATABASE does not reference a database known to Rdb -RMS-E-FNF, file not found
例2: 接続の切断および同じデータベースでの新規接続の開始
この例では、デフォルト接続と現在の接続CAの2つの接続があります。両方の接続でpersonnel_caデータベースが使用されます。SHOW DATABASE文を使用してデータベース設定を表示します。
SQL> -- SQL> -- Establish a default connection by attaching to the personnel_ca SQL> -- database. SQL> -- SQL> ATTACH 'FILENAME personnel_ca'; SQL> SHOW CONNECTIONS; -> RDB$DEFAULT_CONNECTION SQL> -- SQL> -- Start a new connection called CA. SQL> -- SQL> CONNECT TO 'FILENAME personnel_ca' cont> AS 'CA'; SQL> SHOW CONNECTIONS; RDB$DEFAULT_CONNECTION -> CA SQL> -- SQL> -- The DISCONNECT CURRENT statement releases the connection name CA, SQL> -- although the database personnel_ca still belongs to the default SQL> -- connection. SQL> -- SQL> DISCONNECT CURRENT; SQL> SHOW CONNECTIONS; -> RDB$DEFAULT_CONNECTION SQL> -- SQL> -- Even though the database personnel_ca is still attached, CA SQL> -- is no longer an active connection. SQL> -- SQL> SET CONNECT 'CA'; %SQL-F-NOSUCHCON, There is not an active connection by that name SQL> -- SQL> -- The original ATTACH statement comprises the default connection. SQL> -- The DISCONNECT DEFAULT statement detaches the default connection. SQL> -- SQL> DISCONNECT DEFAULT; SQL> SHOW DATABASES; %SQL-F-ERRATTDEF, Could not use database file specified by SQL$DATABASE -RDB-E-BAD_DB_FORMAT, SQL$DATABASE does not reference a database known to Rdb -RMS-E-FNF, file not found
SQLセッションのデフォルト・キャラクタ・セットを指定します。
SET DEFAULT CHARACTER SET文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
セッションのデフォルト・キャラクタ・セットを指定します。runtime-optionsの値は有効なキャラクタ・セットである必要があります。使用可能なキャラクタ・セット名およびオプション値のリストは、第2.1節を参照してください。
parameter parameter-marker
- SET DEFAULT CHARACTER SET文により、セッションのデフォルト・キャラクタ・セットを設定します。
- 言語をSQL99、SQL92またはMIAに設定し、データベースの作成時にデータベースのデフォルト・キャラクタ・セットを指定しない場合、セッションのデフォルト・キャラクタ・セットがデータベースのデフォルト・キャラクタ・セットに割り当てられます。それ以外の場合は、データベースのデフォルト・キャラクタ・セットとしてDEC_MCSが使用されます。
- セッションのデフォルト・キャラクタ・セットは、SQLモジュール・ヘッダー内でDEFAULT CHARACTER SET句を発行するか、またはSET DEFAULT CHARACTER SET文を使用して設定されます。デフォルト・キャラクタ・セットのリストは、第2.1節を参照してください。
- セッションのデフォルト・キャラクタ・セットがモジュール・ヘッダー内で指定されていないか、またはSET DEFAULT CHARACTER SET文を使用して指定されていないときにRDB$CHARACTER_SET論理名が定義されている場合、この論理名に割り当てられている値がキャラクタ・セット名に変換されます。このキャラクタ・セットは、モジュールのデフォルト・キャラクタ・セットとして使用されます。論理名のキャラクタ・セット名への変換の詳細は、表E-2を参照してください。
RDB$CHARACTER_SET論理名は廃止予定であり、将来のリリースではサポートされません。- SHOW CHARACTER SET文を使用して、現在のセッションのキャラクタ・セットを表示します。
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 SHIFT_JIS Literal character set is SHIFT_JIS Display character set is SHIFT_JIS SQL> set default character set 'DEC_KANJI'; 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
DATEデータ型またはCURRENT_TIMESTAMP組込みファンクションの列をVMS形式またはSQL99形式のどちらで解釈するかを指定します。
SET DEFAULT DATE FORMAT文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのプロシージャの一部として
- 動的SQLで動的に実行される文として
'string-literal'
次のいずれかにする必要があるruntime-optionsの値を指定します。
parameter parameter-marker
- SQL99
- SQL92
- VMS
SQL99またはSQL92
DATEデータ型とCURRENT_TIMESTAMP組込みファンクションをSQL規格として解釈するように指定します。SQL規格のDATE形式にはYEAR TO DAYフィールドのみが含まれ、CURRENT_TIMESTAMPではTIMESTAMPデータ型が返されます。VMS
DATEデータ型とCURRENT_TIMESTAMP組込みファンクションをVMS形式として解釈するように指定します。VMS形式のDATEおよびCURRENT_TIMESTAMPには、YEAR TO SECONDフィールドが含まれます。
- SET DIALECT文がSET DEFAULT DATE FORMAT文の後に処理される場合、これにより、SET DEFAULT DATE FORMAT文の設定がオーバーライドされる可能性があります。
- ドメインまたは列を作成した後は、SET DEFAULT DATE FORMAT文はデータ型の変更に使用できません。ドメインまたは列を作成する前に、SET DEFAULT DATE FORMAT文を使用します。
- SET DEFAULT DATE FORMAT文を指定すると、現在の接続のデフォルトの日付書式のみが変更されます。SHOW CONNECTIONS文を使用して、接続の特性を表示します。
例1: DATE形式のSQL99への変更デフォルトではDATEデータ型はOpenVMS DATE形式であるため、次の例ではSQLはエラーを発行します。つまり、DATEデータ型にはYEARからSECONDまでのフィールドが含まれます。SET DEFAULT DATE FORMAT文はCURRENT_DATEとDATEデータ型の互換性が保たれるよう、デフォルトをANSI/ISO形式に変更します。
SQL> set default date format 'VMS'; SQL> -- SQL> create domain LOGGING_DATE cont> DATE cont> default CURRENT_DATE; %SQL-F-DEFVALINC, You specified a default value for LOGGING_DATE which is inconsistent with its data type SQL> -- SQL> set default date format 'SQL99'; SQL> -- SQL> create domain LOGGING_DATE cont> DATE cont> default CURRENT_DATE; SQL> show domain LOGGING_DATE; LOGGING_DATE DATE ANSI Oracle Rdb default: CURRENT_DATE
次の特性について、現在の接続の設定を指定します。
- 文字列パラメータ、列およびドメインの長さを文字とオクテットのどちらで解釈するかを指定します。この特性は、SET CHARACTER LENGTH文でも指定できます。
- 二重引用符を文字列リテラルとデリミタ付き識別子のどちらで解釈するかを指定します。この特性は、SET QUOTING RULES文でも指定できます。
- 識別子をキーワードにできるかどうかを指定します。この特性は、SET KEYWORD RULES文でも指定できます。
- どのビューが読取り専用かを指定します。この特性は、SET VIEW UPDATE RULES文でも指定できます。
- DATEデータ型またはCURRENT_TIMESTAMPデータ型を持つ列をVMSとSQL99のどちらの形式で解釈するかを指定します。この特性は、SET DEFAULT DATE FORMAT文でも指定できます。
- キャラクタ・セットを変更するかどうかを指定します。キャラクタ・セットは、SET DEFAULT CHARACTER SET文、SET NATIONAL CHARACTER SET文、SET IDENTIFIER CHARACTER SET文およびSET LITERAL CHARACTER SET文を使用して変更できます。
SET DIALECT文によって、各設定を個別に指定するのではなく、1つのコマンドで複数の設定を指定できます。
表6-15は、各オプションの設定を示しています。
表6-15 言語設定 特性 SQL991 MIA SQLV40 ORACLE言語2 文字長 文字 文字 オクテット 文字 引用ルール デリミタ付き識別子 デリミタ付き識別子 リテラル デリミタ付き識別子 識別子としてキーワードを使用 × × ○ ○ ビュー更新規則 ANSI/ISO SQLの規則 ANSI/ISO SQLの規則 Oracle Rdbの規則 ANSI/ISO SQLの規則 デフォルトの日付書式 DATE ANSI DATE ANSI DATE VMS DATE VMS パラメータ 必須 必須 使用不可 適用不可 デフォルト・キャラクタ・セット 変更なし KATAKANA 変更なし 変更なし 各国語キャラクタ・セット 変更なし KANJI 変更なし 変更なし 識別子キャラクタ・セット 変更なし DEC_KANJI 変更なし 変更なし リテラル・キャラクタ・セット 変更なし KATAKANA 変更なし 変更なし
以前の言語との互換性維持を必要とする場合を除き、SQL99またはSQL92に言語を設定することをお薦めします。
SET DIALECT文は次の環境で使用できます。
- 対話型SQL内
- 動的SQL文を処理するためにプリコンパイル対象のホスト言語プログラムに埋め込まれる場合(DIALECT句を使用して、プリコンパイルされたソースで言語を変更)
- SQLモジュールのプロシージャの一部として(複合文は含まれない場合がある)
- 動的SQLで動的に実行される文として
ただし、ORACLE言語は対話型SQLおよび動的SQLの環境でのみ使用できます。
ORACLE LEVEL1
次の動作を指定します。
- 予約語チェックおよびDATE ANSI形式を除き、SQL92と同じ言語ルールが適用されます。
- ORACLE LEVEL1言語では、SELECT、DELETE、INSERT、UPDATEなどのデータ操作文で別名を使用して表を参照(またはリンク)できます。次に例を示します。
SQL> ATTACH 'ALIAS pers_alias FILENAME mf_personnel'; SQL> SET DIALECT 'ORACLE LEVEL1'; SQL> SELECT * FROM employees@pers_alias cont> WHERE employee_id = '00164'; EMPLOYEE_ID LAST_NAME FIRST_NAME MIDDLE_INITIAL ADDRESS_DATA_1 ADDRESS_DATA_2 CITY STATE POSTAL_CODE SEX BIRTHDAY STATUS_CODE 00164 Toliver Alvin A 146 Parnell Place Chocorua NH 03817 M 28-Mar-1947 1 1 row selected
別名の参照は表名のみで可能であり、列名では参照できません。表名、単価記号(@)、別名の間に空白は入れられません。
Oracle Rdbデータベースの参照時にスキーマ名を指定すると、マルチスキーマ属性がオンである場合を除き、そのスキーマ名は無視されます。- 不等比較では次の基本条件がサポートされています。
!=
!=基本条件では、対話型SQLのコメント文字との混同を防ぐためにORACLE LEVEL1言語の使用が要求されます。- 動的SQLを使用する際は、クライアント・アプリケーションではパラメータ・マーカー(?)のシノニムを指定できます。たとえば、:name、:1、:2などです。
- 文字列連結演算子およびCONCATファンクションでは、NULLは長さゼロの文字列とみなされます。
- デフォルトの日付書式は、ORACLE LEVEL1言語でのみ演算が可能なDATE VMSです。加算と減算は、INTERVAL DAYデータ型に暗黙的にキャストされている数値データ型を使用して実行できます。小数点は、最も近い整数値に丸められます。
- 長さゼロの文字列はNULLです。Oracle RDBMSデータベースを使用する際、長さゼロのVARCHARはNULLとみなされます。Oracle Rdb ORACLE LEVEL1言語では長さゼロの文字列はデータベースから削除されませんが、これらの文字列の作成は困難になります。次のルールが適用されます。
- 空のリテラル文字列(たとえば、'')はリテラルNULLとみなされます。
- 長さゼロの文字列が発生すると、ファンクションはその文字列のかわりにNULLを返します。これには、ファンクションのコンパイルに使用された言語に関係なくVARCHARデータ型を返すストアド・ファンクションおよび外部ファンクションも含まれます。また、組込みファンクションのTRIMおよびSUBSTRINGも含まれます。
- VARCHARデータ型および長さゼロのパラメータはNULLとみなされます。
長さゼロの文字列をOracle RDBMSアプリケーションで非表示にする最適な方法は、ORACLE言語でコンパイルされたビューのみを使用し、VARCHAR列の表を変更して長さゼロの文字列を削除することです。次の例は、表のVARCHAR列から長さがゼロの文字列を削除する方法を示しています。