ヘッダーをスキップ

Oracle Rdb SQLリファレンス・マニュアル リリース7.2 E06178-01 |
| 目次 | 索引

戻る | 次へ |

# 3.3 文字パラメータの長さの宣言

文字列パラメータの長さを正しく指定するには、次のガイドラインを使用します。

- LANGUAGE Cで宣言されるSQLモジュールをコールするCホスト言語プログラムの場合、文字データ型の列に対応する文字パラメータは、ヌル終端文字を使用できるように、最長の有効列値の長さに1を加えた値として定義する必要があります。

- 他のホスト言語プログラム（または宣言されたSQLモジュールをコールするCホスト言語プログラム）の場合、文字データ型の列に対応する文字パラメータは、オクテット単位による最長の有効列値の長さとして定義する必要があります。

- 最長の有効列値の長さを計算する場合、列のキャラクタ・セットに含まれる文字ごとのオクテット数を考慮し、SQLモジュール言語で列の長さが文字単位またはオクテット単位のどちらで解釈されるかを考慮する必要があります。SQLモジュール言語での列の長さの解釈方法は、プログラムにより次の方法で制御できます。

  - モジュール・ヘッダーまたはDECLARE MODULE文のCHARACTER LENGTH句

  - モジュール・ヘッダーまたはDECLARE MODULE文のDIALECT句

  - SET CHARACTER LENGTH文（動的SQLの場合）

  各キャラクタ・セットで1文字に使用されるオクテット数の詳細は、表2-2を参照してください。

次のキャラクタ・セットを使用してMIA_CHAR_SETデータベースを作成するとします。

- デフォルト・キャラクタ・セット: DEC_KANJI

- 各国語キャラクタ・セット: KANJI

- 識別子キャラクタ・セット: DEC_KANJI

データベースには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();

       .
       .
       .

# 3.4 浮動小数点数表現

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を参照してください。