文字列パラメータの長さを正しく指定するには、次のガイドラインを使用します。
各キャラクタ・セットで1文字に使用されるオクテット数の詳細は、表2-2を参照してください。
次のキャラクタ・セットを使用してMIA_CHAR_SETデータベースを作成するとします。
データベースにはCOLOURS表が含まれ、この表の列が次の例のように定義されるとします。
SQL> SHOW DOMAINS; User domains in database with filename MIA_CHAR_SET ARABIC_DOM CHAR(8) ISOLATINARABIC 8 Characters, 8 Octets DEC_KANJI_DOM CHAR(16) GREEK_DOM CHAR(8) ISOLATINGREEK 8 Characters, 8 Octets HINDI_DOM CHAR(8) DEVANAGARI 8 Characters, 8 Octets KANJI_DOM CHAR(8) KANJI 4 Characters, 8 Octets KATAKANA_DOM CHAR(8) KATAKANA 8 Characters, 8 Octets MCS_DOM CHAR(8) DEC_MCS 8 Characters, 8 Octets RUSSIAN_DOM CHAR(8) ISOLATINCYRILLIC 8 Characters, 8 Octets SQL> -- SQL> SHOW TABLE (COLUMNS) COLOURS; Information for table COLOURS Columns for table COLOURS: Column Name Data Type Domain ----------- --------- ------ ENGLISH CHAR(8) MCS_DOM DEC_MCS 8 Characters, 8 Octets FRENCH CHAR(8) MCS_DOM DEC_MCS 8 Characters, 8 Octets JAPANESE CHAR(8) KANJI_DOM KANJI 4 Characters, 8 Octets ROMAJI CHAR(16) DEC_KANJI_DOM KATAKANA CHAR(8) KATAKANA_DOM KATAKANA 8 Characters, 8 Octets HINDI CHAR(8) HINDI_DOM DEVANAGARI 8 Characters, 8 Octets GREEK CHAR(8) GREEK_DOM ISOLATINGREEK 8 Characters, 8 Octets ARABIC CHAR(8) ARABIC_DOM ISOLATINARABIC 8 Characters, 8 Octets RUSSIAN CHAR(8) RUSSIAN_DOM ISOLATINCYRILLIC 8 Characters, 8 Octets SQL> |
SQLモジュール・プログラムの次の抜粋は、キャラクタ・セットの指定方法およびモジュール・ヘッダーにおける文字長の割当て方法を示しています。
------------------------------------------------------------------------------- -- Header Information Section ------------------------------------------------------------------------------- MODULE SQL_MIA_CHAR_SET_C -- Module name DIALECT SQL92 -- Sets the character length to CHARACTERS NAMES ARE DEC_KANJI -- Names character set NATIONAL CHARACTER SET KANJI -- National character set DEFAULT CHARACTER SET DEC_KANJI -- Default character set LANGUAGE C -- Language of calling program AUTHORIZATION SQL_SAMPLE -- Default authorization ID ALIAS RDB$HANDLE -- Default alias . . . -- When you declare character string parameters, you must take into -- account the character set of the corresponding SQL column, whether -- the characters are single- or multiple-octet characters, and -- whether the module specified the character length in octets -- or characters. -- -- Create domains PROCEDURE CREATE_DOMAIN_MCS SQLCODE; CREATE DOMAIN MCS_DOM CHAR (8) CHARACTER SET DEC_MCS; -- -- The CREATE DATABASE statement and the module header identify -- KANJI as the national character set. Thus, you can declare -- the KANJI_DOM domain as data type NCHAR. -- PROCEDURE CREATE_DOMAIN_KANJI SQLCODE; CREATE DOMAIN KANJI_DOM NCHAR (4); -- -- Because the module header and the CREATE DATABASE statement -- define DEC_KANJI as the default character set, you do not -- have to identify the character set for the DEC_KANJI_DOM -- domain. -- PROCEDURE CREATE_DOMAIN_DEC_KANJI SQLCODE; CREATE DOMAIN DEC_KANJI_DOM CHAR (8); PROCEDURE CREATE_DOMAIN_KATAKANA SQLCODE; CREATE DOMAIN KATAKANA_DOM CHAR (8) CHARACTER SET KATAKANA; . . . |
次の例に示すように、対応するパラメータをCホスト言語プログラムで宣言します。
/* When you declare character string parameters, you must take into */ /* account the character set of the corresponding SQL column, whether */ /* the characters are single- or multiple-octet characters, and */ /* whether the module specifies the character length in octets */ /* or characters. */ typedef char colour_string_t[17]; long sqlcode; enum languages { ENGLISH, FRENCH, JAPANESE, ROMAJI, KATAKANA, HINDI, GREEK, ARABIC, RUSSIAN, MAX_LANGUAGE }; enum colours { MAX_COLOUR = 6 }; static char *language_name[] = /* (NOTE: in the same sequence as the enum) */ { "ENGLISH ", "FRENCH ", "JAPANESE ", "ROMAJI ", "KATAKANA ", "HINDI ", "GREEK ", "ARABIC ", "RUSSIAN ", }; main() { static colour_string_t prism[MAX_LANGUAGE][MAX_COLOUR]; int colour_count; int language; int colour; CREATE_MIA_CHAR_SET_DB(&sqlcode); if (sqlcode != SUCCESS) check_error(); . . . |
OpenVMSでは、浮動小数点数に対して複数の表現がサポートされています。これらの表現には、単精度(4オクテット)数の場合のVAX F浮動小数点およびIEEE S浮動小数点、倍精度(8オクテット)数の場合のVAX G浮動小数点、D浮動小数点およびIEEE T浮動小数点の各表現が含まれます。SQLモジュール言語プロセッサおよび様々なホスト言語プロセッサで生成されるモジュールでは、単精度浮動小数点データ型および倍精度浮動小数点データ型に対してこれらの表現がサポートされています。SQLモジュール言語モジュールをコールするホスト言語モジュールでは、それらのモジュールのプロシージャ・パラメータを使用して浮動小数点表現を一貫して定義する必要があります。定義しない場合、浮動小数点数の値は正しく解釈されません。これは、ホスト言語とSQLデータ型が同じ場合でも該当します。SQLモジュール言語の場合、浮動小数点表現はコマンドラインの/FLOAT修飾子の値で決まります(/FLOAT修飾子の詳細は、第3.6節を参照)。ホスト言語の場合は、/FLOAT修飾子または/[NO]G_FLOAT修飾子と、浮動小数点表現の内部言語サポートとの組合せで決まります(一致するホスト言語の浮動小数点表現の詳細は、第3.5節を参照)。次のコード例は、IEEE形式を使用して、様々なホスト言語で一貫した浮動小数点表現を行う方法を示しています。
次に示す実パラメータ・タイプについては、例ではシングルトン選択を返すと想定される次のSQLモジュール言語プロシージャを参照します。
PROCEDURE GET_FLOATS (SQLCODE, REAL :P_FLOAT1, DOUBLE PRECISION :P_FLOAT2); BEGIN SELECT MY_FLOAT1, MY_FLOAT2 INTO :P_FLOAT1, :P_FLOAT2 FROM A_TABLE WHERE KEY_VALUE = "1"; END; |
次の例では、SQLモジュール言語プログラムが/FLOAT=IEEE_FLOATを指定してコンパイルされている場合の、GET_FLOATSサンプル・プロシージャと互換性を持つAdaコードの一部を示しています。
procedure GET_FLOATS ( SQLCODE : out INTEGER; P_FLOAT1 : out IEEE_SINGLE_FLOAT; P_FLOAT2: out IEEE_DOUBLE_FLOAT ); pragma INTERFACE (NONADA, GET_FLOATS); SQLCODE : INTEGER; FLOAT1 : SYSTEM.IEEE_SINGLE_FLOAT; FLOAT2 : SYSTEM.IEEE_DOUBLE_FLOAT; ... GET_FLOATS( SQLCODE, FLOAT1, FLOAT2); |
BASICは、REALキーワードを使用して宣言する浮動小数点変数のサイズのみでなく、その形式も指定できる/REAL_SIZE修飾子も備えています。IEEE浮動小数点形式のこの修飾子に関係する値は、SFLOATおよびTFLOATです。これらの値により、REAL変数がS浮動小数点型またはT浮動小数点型としてそれぞれ指定されます。BASICは、REALのサイズおよび形式をさらにローカルな有効範囲で指定できるOPTIONコマンドも備えています。
また、BASICには、ST浮動小数点型変数およびT浮動小数点型変数をそれぞれ明示的に指定するネイティブ・データ型(SFLOATおよびTFLOAT)もあります。
次の例では、GET_FLOATSサンプル・プロシージャと互換性を持つBASICコードの一部を示します。
EXTERNAL GET_FLOATS(LONG, SFLOAT, TFLOAT) DECLARE LONG SQLCODE DECLARE SFLOAT FLOAT1 DECLARE TFLOAT FLOAT2 ... CALL GET_FLOATS(SQLCODE, FLOAT1, FLOAT2) |
Cには/FLOAT修飾子および/[NO]G_FLOAT修飾子があり、SQL$MOD用のこれらの修飾子と同一の動作をします(デフォルトは異なる可能性があります)。つまり、Cプログラムの浮動小数点変数の形式は修飾子で決まります。Cにはfloatおよびdoubleのネイティブ型があり、それぞれ32ビットおよび64ビットの浮動小数点数です。SQLデータ型とCデータ型間の等価性は、表3-6を参照してください。
次の例では、CモジュールとSQLモジュール言語プログラムの両方が/FLOAT修飾子または/[NO]G_FLOAT修飾子の同じ設定を使用してコンパイルされている場合の、GET_FLOATSサンプル・プロシージャと互換性を持つCコードの一部を示しています。
extern void GET_FLOATS ( long *SQLCODE, float *P_FLOAT1, double *P_FLOAT2 ); long SQLCODE; float float1; double float2; ... GET_FLOATS( &SQLCODE, &float1, &float2); |
COBOLには、SQL$MODと同じオプションを持つ/FLOAT修飾子があります(デフォルトのD_FLOATを除く)。/[NO]G_FLOAT修飾子はありません。/FLOAT修飾子はSQL$MOD用のその修飾子と同一の動作をします。つまり、COBOLプログラムの浮動小数点変数の形式は修飾子で決まります。COBOLにはCOMP-1およびCOMP-2のネイティブ型があり、それぞれ32ビットおよび64ビットの浮動小数点数です。
次の例では、COBOLプログラムとSQLモジュール言語プログラムの両方が/FLOAT修飾子の同じ設定を使用してコンパイルされている場合の、GET_FLOATSサンプル・プロシージャと互換性を持つCOBOLコードの一部を示しています。
DATA DIVISION. WORKING-STORAGE SECTION. 01 SQLCODE PIC S9(9) USAGE COMP. 01 FLOAT1 COMP-1. 01 FLOAT2 COMP-2. ... CALL "GET_FLOATS" USING SQLCODE, FLOAT1, FLOAT2. |
FORTRANには/FLOAT修飾子および/[NO]G_FLOAT修飾子があり、SQL$MOD用のこれらの修飾子と同一の動作をします(デフォルトは異なる可能性があります)。つまり、FORTRANプログラムの浮動小数点変数の形式は修飾子で決まります。FORTRANには、32ビットの浮動小数点数であるrealとreal*4、および64ビットの浮動小数点数であるdouble precisionとreal*8のネイティブ型があります。
次の例では、FORTRANモジュールとSQLモジュール言語プログラムの両方が/FLOAT修飾子または/[NO]G_FLOAT修飾子の同じ設定を使用してコンパイルされている場合の、GET_FLOATSサンプル・プロシージャと互換性を持つFORTRANコードの一部を示しています。
integer*4 SQLCODE real*4 float1 real*8 float2 ... CALL GET_FLOATS( SQLCODE, float1, float2) |
Pascalには/FLOAT修飾子および/[NO]G_FLOAT修飾子があり、SQL$MOD用のこれらの修飾子と同様の動作をします(デフォルトは異なる可能性があります)。つまり、Pascalプログラムの特定のデータ型の浮動小数点変数の形式は修飾子で決まります。修飾子の影響を受けるPascalのネイティブ・データ型は、REAL、SINGLEおよびDOUBLEです。最初の2つは32ビットの浮動小数点数であり、最後の1つは64ビットの浮動小数点数です。Pascalには、/FLOAT修飾子と同様ですが、よりローカルな有効範囲で浮動小数点の形式に影響を与えることができるFLOATと呼ばれる属性があります。具体的には、FLOAT属性でIEEE_FLOATキーワードを使用すると、IEEE浮動小数点形式を指定できます。
また、Pascalには、修飾子の設定にかかわらず特定の形式を指定する、形式固有の浮動小数点データ型がいくつかあります。形式固有のデータ型にはS_FLOATおよびT_FLOATがあり、それぞれIEEE32ビットおよびIEEE64ビットの浮動小数点数です。
次の例では、SQLモジュール言語プログラムが/FLOAT=IEEE_FLOATINGを指定してコンパイルされている場合の、GET_FLOATSサンプル・プロシージャと互換性を持つPascalコードの一部を示しています。
sqlcode : INTEGER; float1 : S_FLOAT; float2 : T_FLOAT: PROCEDURE GET_FLOATS ( VAR SQLCODE : INTEGER; VAR FLOAT_1 : S_FLOAT; VAR FLOAT_2 : T_FLOAT ); EXTERNAL; ... GET_FLOATS( sqlcode, float1, float2 ); |
PL/Iには/FLOAT修飾子および/[NO]G_FLOAT修飾子があり、SQL$MOD用のこれらの修飾子と同一の動作をします(デフォルトは異なる可能性があります)。つまり、PL/Iプログラムの浮動小数点変数の形式は修飾子で決まります。PL/IにはFLOATのネイティブ型があり、サイズ指定に応じて32ビットおよび64ビットの浮動小数点数にできます。
次の例では、PL/IモジュールとSQLモジュール言語プログラムの両方が/FLOAT修飾子または/[NO]G_FLOAT修飾子の同じ設定を使用してコンパイルされている場合の、GET_FLOATSサンプル・プロシージャと互換性を持つPL/Iコードの一部を示しています。
DECLARE GET_FLOATS EXTERNAL ENTRY ( ANY REFERENCE, ANY REFERENCE, ANY REFERENCE); DECLARE SFLOAT FLOAT(24) BINARY, TFLOAT FLOAT(53) BINARY, SQLCODE BIN FIXED(31); ... CALL GET_FLOATS( SQLCODE, SFLOAT, TFLOAT ); |
Oracle Rdbでは、それぞれF浮動小数点(F_FLOAT)およびG浮動小数点(G_FLOAT)と呼ばれるVAX 32ビット型とVAX 64ビット型を使用して、浮動小数点数が内部的に格納されます。つまり、ホスト言語プログラムでIEEE形式が使用される場合、VAX形式とIEEE形式間で変換が行われます。VAX形式とIEEE形式では、小数部と指数で使用可能なビット数が異なります。また、IEEE形式には、無限値用に予約されている特定の指数値があります。これらの相違が原因で、変換プロセス中に浮動小数点のオーバーフローやアンダーフローおよび丸めエラーが発生する可能性があります。VAX浮動小数点形式とIEEE浮動小数点形式での最大値と最小値のデータの詳細は、OpenVMSオペレーティング・システム・ドキュメントの『Portable Mathematics Library』の付録Aを参照してください。 |