ヘッダーをスキップ

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

戻る | 次へ |

# 3.5 同等のSQLデータ型およびホスト言語データ型

モジュールの仮パラメータに指定されるSQLデータ型は、実パラメータのホスト言語変数宣言のデータ型に相当する必要があります。仮パラメータと実パラメータが同じデータ型で宣言されていない場合は、予期しない結果が生じる可能性があります。各ホスト言語の同等なデータ型を確認するには、表3-3〜表3-10を参照してください。

ただし、通常、ホスト言語ではSQLでサポートされているデータ型と同一のセットはサポートされません。ホスト言語でサポートされないデータ型で定義されているデータベースの列を使用するには、ホスト言語でサポートされているデータ型の仮パラメータをモジュールで宣言する必要があります。プロシージャのSQL文が実行されると、データベース列のデータ型および仮パラメータのデータ型は自動的に変換されます。

この技術については、次のBASICプログラムの一部およびそれに関連するSQLモジュールで示します。BASICでは可変文字列（VARCHAR）データ型をサポートしませんが、SQLのCHAR文字列データ型に相当するSTRINGデータ型をサポートしています。SQLモジュールでは、仮パラメータをCHAR型として宣言し、そのパラメータを使用してVARCHAR型のデータベース列と値が受け渡されます。SQLでは、列のVARCHARデータ型と仮パラメータのCHARデータ型間の変換が行われます。SQLモジュールをコールするBASICでは、CHAR型の仮パラメータと互換性のあるSTRING型として、対応する実パラメータが宣言されています。

例

例1: BASICによるVARCHARデータの挿入

       .
       .
       .
    ! Program declares STRING variables for use as actual parameters for
    ! procedures. VC_FIELD will contain values to be passed to and from a
    ! VARCHAR field in a table.

        DECLARE STRING EMPLOYEE_ID,VC_FIELD
       .
       .
       .
    ! Call an SQL module procedure that creates a table with a VARCHAR column:

        CALL CREATE_TABLE(sql_return_status)
        IF sql_return_status < 0 THEN
            CALL ROLLBACK_TRANSACTION(sql_return_status)
            PRINT 'Error creating table.  Exiting program.'
            EXIT PROGRAM
        END IF

    ! Call a procedure to insert a row into the table, using
    ! VC_FIELD to pass values to the VARCHAR column in the table.

        employee_id = '00550'
        vc_field = 'Inserting employee 550 into the table'

        CALL INSERT_VC(sql_return_status,employee_id,vc_field)
        IF sql_return_status < 0 THEN
            CALL ROLLBACK_TRANSACTION(sql_return_status)
            PRINT 'Error inserting row.  Exiting program.'
            EXIT PROGRAM
        END IF

このBASICコール側プログラムに対応するSQLモジュールの一部を次に示します。

       .
       .
       .
    -----------------------------------------------------------
    -- Procedure Section
    -----------------------------------------------------------

    -- This procedure creates the table with the VARCHAR column.

    PROCEDURE CREATE_TABLE
        SQLCODE;

        CREATE TABLE VC_TABLE
            (
            EMPLOYEE_ID     CHAR(5),
            VC_FIELD        VARCHAR(80)
            );

    -- This procedure inserts a row into the table. Note that the formal
    -- parameter P_VC_FIELD is declared as CHAR to correspond with the actual
    -- parameter, not as VARCHAR to correspond with its column in the table.

    PROCEDURE INSERT_VC
        SQLCODE
        P_EMPLOYEE_ID       CHAR(5)
        P_VC_FIELD          CHAR(80);

        INSERT INTO VC_TABLE
            VALUES
                (
                P_EMPLOYEE_ID,
                P_VC_FIELD
                );
       .
       .
       .

日時データ型の1つとして定義されている表列の処理が必要なSQLモジュール・プロシージャでは、この技術への例外が必要です。ホスト言語では日時データ型がサポートされないため、日時データ型として定義されている表列を使用する必要があるコール側プログラムでは、特殊な対応をする必要があります。

表3-2に、SQLの各データ型で仮パラメータを宣言するときに必要となる、実パラメータのOpenVMSデータ型を示します。

表3-2 モジュール言語のSQLデータ型および対応するOpenVMSデータ型
仮パラメータのデータ型 | 必要となるOpenVMSデータ型の実パラメータ
--- | ---
CHAR (n) | 文字列（DSC$K_DTYPE_T）
CHAR (n)、キャラクタ・セットによる修飾 | 文字列（DSC$K_DTYPE_T）
NCHAR (n) | 文字列（DSC$K_DTYPE_T）
VARCHAR (n) | 可変文字列（DSC$K_DTYPE_VT）1
VARCHAR (n)、キャラクタ・セットによる修飾 | 可変文字列（DSC$K_DTYPE_VT）1
NCHAR VARYING(n) | 可変文字列（DSC$K_DTYPE_VT）1
LONG VARCHAR | 可変文字列（DSC$K_DTYPE_VT）1
TINYINT [(n)]2 | 符号付きバイト整数（DSC$K_DTYPE_B）
SMALLINT [(n)]2 | 符号付きワード整数（DSC$K_DTYPE_W）
INTEGER [(n)]2 | 符号付きロングワード整数（DSC$K_DTYPE_L）
BIGINT [(n)] | 符号付きクワッドワード整数（DSC$K_DTYPE_Q）1、4、5、9
QUADWORD [(n)] | 符号付きクワッドワード整数（DSC$K_DTYPE_Q）1、4、5、9
DECIMAL [(n)[,(n)]] | パック10進数文字列（DSC$K_DTYPE_P）1、3
NUMERIC [(n)[,(n)]] | 左区切り記号付き数値文字列（DSC$K_DTYPE_NL）1、3、5
FLOAT [(n)] | nの値に応じた、単精度浮動小数点数または倍精度浮動小数点数。単精度浮動小数点数の場合はDSC$K_DTYPE_FまたはDSC$K_DTYPE_FS6、倍精度浮動小数点数の場合はDSC$K_DTYPE_G、DSC$K_DTYPE_DまたはDSC$K_DTYPE_FT。7
REAL | 単精度浮動小数点数（DSC$K_DTYPE_FまたはDSC$K_DTYPE_FS）。6
DOUBLE PRECISION | 倍精度浮動小数点数（DSC$K_DTYPE_G、DSC$K_DTYPE_DまたはDSC$K_DTYPE_FT）。7
(DATE) | 同等のOpenVMSデータ型なし（2つのロングワードで構成される配列）
DATE ANSI | 同等のOpenVMSデータ型なし（2つのロングワードで構成される配列）
DATE VMS | 絶対日時（DSC$K_DTYPE_ADT）
TIME | 同等のOpenVMSデータ型なし（2つのロングワードで構成される配列）
TIMESTAMP | 同等のOpenVMSデータ型なし（2つのロングワードで構成される配列）
INTERVAL（年月） | 同等のOpenVMSデータ型なし（2つのロングワードで構成される配列）
INTERVAL（日時） | 同等のOpenVMSデータ型なし（2つのロングワードで構成される配列）
LIST OF BYTE VARYING | サポートなし8

1FORTRANまたはBASICではサポートされません。SQLで警告メッセージが生成されます。
2スケール変更係数は、C、FORTRAN、PL/I、Ada、PascalまたはBASICではサポートされません。SQLで警告メッセージが生成されます。
3C、AdaまたはPascalではサポートされません。SQLで警告メッセージが生成されます。
4PL/Iではサポートされません。SQLで警告メッセージが生成されます。
5BASICではサポートされません。SQLで警告メッセージが生成されます。
6単精度数の浮動小数点表現は、SQLモジュール・プロセッサ・コマンドラインの/FLOAT修飾子の値によって決まります。IEEE_FLOATの場合はDSC$K_DTYPE_FS、G_FLOATまたはD_FLOATの場合はDSC$K_DTYPE_Fです。
7倍精度数の浮動小数点表現は、SQLモジュール・プロセッサ・コマンドラインの/FLOAT修飾子の設定によって決まります。IEEE_FLOATの場合はDSC$K_DTYPE_FS、G_FLOATの場合はDSC$K_DTYPE_G、D_FLOATの場合はDSC$K_DTYPE_Dです。
8モジュール言語では、仮パラメータのデータ型としてLIST OF BYTE VARYINGはサポートされません。ただし、8バイトの文字列またはクワッドワードを使用して、セグメント化された文字列識別子、リストの先頭要素のポインタを取得できます。リストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用します。
9Adaではサポートされません。SQLで警告メッセージが生成されます。

次の表は、各SQL仮パラメータのデータ型、およびSQLで受け入れられる対応する実パラメータの特定のホスト言語での宣言の例を示しています。

表3-3は、SQL仮パラメータに対するAda宣言を示しています。SQLモジュール言語で使用可能なAdaパッケージの詳細は、この項の最後にある「使用方法」を参照してください。SQL_STANDARD Adaパッケージにより、ANSI/ISO SQL規格でサポートされているデータ型が定義されます。

表3-3 SQL仮パラメータのデータ型に対するAda宣言
SQL仮パラメータのデータ型 | 互換性のあるAdaのパラメータ宣言2
--- | ---
CHAR(10) | STR1 : string(1..10);
CHAR(10) CHARACTER SET KANJI | STR1 : string(1..20);1
NCHAR(10) | STR1 : string(1..10);1
VARCHAR(80) | データ型VARCHAR_80は次のとおり record VAR_LEN : short_integer; VAR_TEXT : array (1..80) of character; end record; STR2 : varchar_80;
VARCHAR(80) CHARACTER SET KANJI | データ型VARCHAR_160は次のとおり record VAR_LEN : short_integer; VAR_TEXT : array (1..160) of character; end record; STR2 : varchar_160;1
NCHAR VARYING(80) | データ型VARCHAR_80は次のとおり record VAR_LEN : short_integer; VAR_TEXT : array (1..80) of character; end record; STR2 : varchar_80;1
LONG VARCHAR | データ型VARCHAR_16383は次のとおり record VAR_LEN : short_integer; VAR_TEXT : array (1..16383) of character; end record; STR3 : varchar_16383;
TINYINT(2) TINYINT | サポートなし3 NUM1 : short_short_integer;4
SMALLINT SMALLINT | サポートなし3 NUM1 : short_integer;
INTEGER(2) INTEGER | サポートなし3 NUM2 : integer;
BIGINT(2) BIGINT | サポートなし3 サポートなし3
DECIMAL(2) DECIMAL | サポートなし3 サポートなし3
NUMERIC(2) NUMERIC | サポートなし3 サポートなし3
FLOAT(6) FLOAT(25) | 表3-4を参照。 表3-4を参照。
REAL | 表3-4を参照。
DOUBLE PRECISION | 表3-4を参照。
DATE | DATEの解釈に依存5
DATE ANSI | 同等のOpenVMSなし6
DATE VMS | データ型SQL_DATE_VMSは次のとおり record 10 : integer; 11 : integer; end record;
TIME | 同等のOpenVMSなし6
TIMESTAMP | 同等のOpenVMSなし6
INTERVAL DAY TO SECOND | 同等のOpenVMSなし6、7
LIST OF BYTE VARYING | OpenVMSでサポートされない仮パラメータのデータ型8

1文字長およびモジュール言語の詳細は、第3.3節を参照してください。
2セッションのデフォルト・キャラクタ・セットおよび各国語キャラクタ・セットがDEC_MCSであると想定しています。
3Adaでは、クワッドワード、スケール付き整数、10進数または数値の各データ型はサポートされません。これらのデータ型で定義されている列をデータベースから取得するには、Adaでサポートされているデータ型で仮パラメータを宣言し、SQLモジュール・プロシージャ文でこれらの仮パラメータを参照します。SQLで列内のデータが仮パラメータのデータ型に変換されます。
4これはDEC Ada拡張です。
5SQLでは、SQLモジュール・ファイル内でDEFAULT DATE FORMAT SQL92を指定して定義環境を変更しないかぎり、修飾されていないDATEデータ型はデフォルトでDATE VMSとして解釈されます。
6DATE VMS以外では、日時データ型の長さと書式はOracle Rdbで使用するために予約されています。ホスト・プログラムでは、表4-2に示されているデータ型を使用してください。
7INTERVALデータ型には、他に12個の修飾子の組合せがあります。表2-9を参照してください。
8モジュール言語では、仮パラメータのデータ型としてLIST OF BYTE VARYINGはサポートされません。ただし、8バイトの文字列を使用して、セグメント化された文字列識別子、リストの先頭要素のポインタを取得できます。リストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用します。

表3-4は、Ada宣言および浮動小数点の書式を示しています。

表3-4 Ada宣言および浮動小数点の書式
Ada宣言 | 互換性のあるSQL$MOD宣言
--- | ---
    pragma FLOAT_REPRESENTATION VAX_FLOAT

    ...

    FLOAT1 : STANDARD.FLOAT;
    $SQL$MOD/ADA/FLOAT=G_FLOAT - or

    $SQL$MOD/ADA/FLOAT=D_FLOAT

    ...

    REAL :P_FLOAT1 - or -

    FLOAT(24) :P_FLOAT1
    pragma FLOAT_REPRESENTATION VAX_FLOAT

    pragma LONG_FLOAT G_FLOAT

    ...

    FLOAT1 : STANDARD.LONG_FLOAT;
    $SQL$MOD/ADA/FLOAT=G_FLOAT

    ...

    DOUBLE_PRECISION :P_FLOAT1 - or -

    FLOAT(53) :P_FLOAT1
    pragma FLOAT_REPRESENTATION VAX_FLOAT

    pragma LONG_FLOAT D_FLOAT

    ...

    FLOAT2 : STANDARD.LONG_FLOAT;
    $SQL$MOD/ADA/FLOAT=D_FLOAT

    ...

    DOUBLE_PRECISION :P_FLOAT2 - or -

    FLOAT(53) :P_FLOAT2
    ...

    FLOAT1 : SYSTEM.F_FLOAT;

    FLOAT2 : SYSTEM.D_FLOAT;
    $SQL$MOD/ADA/FLOAT=D_FLOAT

    ...

    REAL :P_FLOAT1 - or -

    FLOAT(24) :P_FLOAT1

    DOUBLE_PRECISION :P_FLOAT2 - or -

    FLOAT(53) :P_FLOAT2
    ...

    FLOAT1 : SYSTEM.F_FLOAT;

    FLOAT2 : SYSTEM.G_FLOAT;
    $SQL$MOD/ADA/FLOAT=G_FLOAT

    ...

    REAL :P_FLOAT1 - or -

    FLOAT(24) :P_FLOAT1

    DOUBLE_PRECISION :P_FLOAT2 - or -

    FLOAT(53) :P_FLOAT2
    ...

    FLOAT1 : SYSTEM.IEEE_SINGLE_FLOAT;

    FLOAT2 : SYSTEM.IEEE_DOUBLE_FLOAT;
    $SQL$MOD/ADA/FLOAT=IEEE_FLOAT

    ...

    REAL :P_FLOAT1 - or -

    FLOAT(24) :P_FLOAT1

    DOUBLE_PRECISION :P_FLOAT2 - or -

    FLOAT(53) :P_FLOAT2

表3-5は、SQL仮パラメータに対するBASIC宣言を示しています。

表3-5 SQL仮パラメータのデータ型に対するBASIC宣言
SQL仮パラメータのデータ型 | 互換性のあるBASICのパラメータ宣言11
--- | ---
CHAR(10) | DECLARE STRING STR11
CHAR(10) CHARACTER SET KANJI | DECLARE STRING STR11、10
NCHAR(10) | DECLARE STRING STR11、10
VARCHAR(80) | サポートなし2
VARCHAR(80) CHARACTER SET KANJI | サポートなし2
NCHAR VARYING(80) | サポートなし2
LONG VARCHAR | サポートなし2
TINYINT(2) TINYINT | サポートなし2 DECLARE BYTE
SMALLINT(2) SMALLINT | サポートなし2 DECLARE WORD NUM1
INTEGER(2) INTEGER | サポートなし2 DECLARE LONG NUM2
BIGINT(2) BIGINT | サポートなし2 DECLARE QUAD NUM3
DECIMAL(9) DECIMAL(18) DECIMAL(18,2) | DECLARE DECIMAL (9, 0) NUM7 DECLARE DECIMAL (18, 0) NUM7 DECLARE DECIMAL (18, 2) NUM7
NUMERIC(2) NUMERIC | サポートなし2 サポートなし2
FLOAT(6) | DECLARE SINGLE NUM43 DECLARE SFLOAT NUM44
FLOAT(25) | DECLARE DOUBLE NUM43 DECLARE TFLOAT NUM44 DECLARE DFLOAT NUM45
REAL | DECLARE SINGLE NUM43 DECLARE SFLOAT NUM44
DOUBLE PRECISION | DECLARE DOUBLE NUM43 DECLARE TFLOAT NUM44 DECLARE DFLOAT NUM45
DATE | DATEの解釈に依存4 DECLARE DATE_REC START_DATE、END_DATE
DATE VMS | RECORD DATE_REC STRING DATE_STRING=8 END RECORD DATE_REC
DATE ANSI | 同等のOpenVMSなし7 DECLARE DATE_REC START_DATE、END_DATE
TIME | 同等のOpenVMSなし7 DECLARE TIME_REC START_TIME、END_TIME
TIMESTAMP | 同等のOpenVMSなし7 DECLARE TIMESTAMP_REC START_TIMESTAMP、END_TIMESTAMP
INTERVAL DAY TO SECOND | 同等のOpenVMSなし7、8 DECLARE INTERVAL_REC START_INTERVAL、END_INTERVAL7
LIST OF BYTE VARYING | サポートなし9

1BASICの動的文字列データ型では、文字列長の引数は受け入れられません。BASICでは、STRINGデータは記述子によって渡されます。STRINGデータでは、CHAR型の仮パラメータの長さ引数は無視され、記述子を使用して文字列の長さの読取り（入力）または設定（出力）が行われます。
2BASICでは、可変文字、スケール付き整数または数値の各データ型はサポートされません。これらのデータ型で定義されている列をデータベースから取得するには、BASICでサポートされているデータ型で仮パラメータを宣言し、SQLモジュール・プロシージャ文でこれらの仮パラメータを参照します。SQLで列内のデータが仮パラメータのデータ型に変換されます。
3SQLモジュール・プロセッサのコマンドラインで/FLOAT=G_FLOATが指定されている場合。
4SQLモジュール・プロセッサのコマンドラインで/FLOAT=IEEE_FLOATが指定されている場合。
5SQLモジュール・プロセッサのコマンドラインで/FLOAT=D_FLOATが指定されている場合。
6SQLでは、SQLモジュール・ファイル内でDEFAULT DATE FORMAT SQL92を指定して定義環境を変更しないかぎり、修飾されていないDATEデータ型はデフォルトでDATE VMSとして解釈されます。
7DATE VMS以外では、日時データ型の長さと書式はOracle Rdbで使用するために予約されています。ホスト・プログラムでは、表4-2に示されているデータ型を使用してください。
8INTERVALデータ型には、他に12個の修飾子の組合せがあります。表2-9を参照してください。
9モジュール言語では、仮パラメータのデータ型としてLIST OF BYTE VARYINGはサポートされません。ただし、8バイトの文字列を使用して、セグメント化された文字列識別子、リストの先頭要素のポインタを取得できます。リストの個別要素の値を取得するには、CHARデータ型のホスト言語変数を使用します。
10文字長およびモジュール言語の詳細は、第3.3節を参照してください。
11セッションのデフォルト・キャラクタ・セットおよび各国語キャラクタ・セットがDEC_MCSであると想定しています。

表3-6は、SQL仮パラメータに対するC宣言を示しています。

表3-6 SQL仮パラメータのデータ型に対するC宣言
SQL仮パラメータのデータ型 | 互換性のあるCのパラメータ宣言10
--- | ---
CHAR(10) | char str1[11]1、11
CHAR(10) CHARACTER SET KANJI | char str1[21]1、8、11
NCHAR(10) | char str1[11]1、8、11
VARCHAR(80) | 言語依存9、11
VARCHAR(80) CHARACTER SET KANJI | 言語依存9、11
NCHAR VARYING(80) | 言語依存2、8、9、11
LONG VARCHAR | 言語依存2、8、11
TINYINT(2) TINYINT | サポートなし2 char x
SMALLINT(2) SMALLINT | サポートなし2 short num1
INTEGER(2) INTEGER | サポートなし2 int num2
BIGINT(2) BIGINT | サポートなし2 __int64
DECIMAL(2) DECIMAL | サポートなし2 サポートなし2
NUMERIC(2) NUMERIC | サポートなし2 サポートなし2
FLOAT(6) FLOAT(25) | float num43 double num43
REAL | float num53
DOUBLE PRECISION | double num63
DATE | DATEの解釈に依存4
DATE ANSI | 同等のOpenVMSなし5
DATE VMS | struct { int 10; int 11; }sql_date_vms;
TIME | 同等のOpenVMSなし5
TIMESTAMP | 同等のOpenVMSなし5
INTERVAL DAY TO SECOND | 同等のOpenVMSなし5、6
LIST OF BYTE VARYING | サポートなし7

1SQLでは、文字列はASCIZ形式と想定されています。このため、CHAR列のCHARホスト言語変数は列サイズより1文字多いものとして宣言します。（これにより、ASCIZ文字列の最後にヌル文字用の空白を確保できます。）データ・ディクショナリから定義をコピーするときに、パラメータ宣言のレコード型句で文字解釈オプションを指定して、この制限を回避できます。
2Cでは、可変文字、スケール付き整数、10進数または数値の各データ型はサポートされません。これらのデータ型で定義されている列をデータベースから取得するには、Cでサポートされているデータ型で仮パラメータを宣言し、SQLモジュール・プロシージャ文でこれらの仮パラメータを参照します。SQLで列内のデータが仮パラメータのデータ型に変換されます。
3SQLモジュール・プロセッサのコマンドラインの/FLOAT修飾子または/[NO]G_FLOAT修飾子は、Cのコンパイルのそれと一致している必要があります。
4SQLでは、SQLモジュール・ファイル内でDEFAULT DATE FORMAT SQL92を指定して定義環境を変更しないかぎり、修飾されていないDATEデータ型はデフォルトでDATE VMSとして解釈されます。
5DATE VMS以外では、日時データ型の長さと書式はOracle Rdbで使用するために予約されています。ホスト・プログラムでは、表4-2に示されているデータ型を使用してください。
6INTERVALデータ型には、他に12個の修飾子の組合せがあります。表2-9を参照してください。
7モジュール言語では、仮パラメータのデータ型としてLIST OF BYTE VARYINGはサポートされません。ただし、8バイトの文字列を使用して、セグメント化された文字列識別子、リストの先頭要素のポインタを取得できます。リストの個別要素の値を取得するには、CHARデータ型のホスト言語変数を使用します。
8文字長およびモジュール言語の詳細は、第3.3節を参照してください。
9Cでは可変文字データ型はサポートされませんが、DIALECT SQL92およびC言語を指定する場合、仮パラメータをVARCHAR、NCHAR VARYINGおよびLONG VARCHARとして宣言できます。SQLでは、これらのパラメータはASCIZ（ヌル終端文字列）として渡されます。DIALECT SQLV40またはSQL89を指定すると、SQLではこれらのパラメータをASCIW（事前にワードの長さを指定）として渡し、廃止予定の機能を示すメッセージが返されます。DIALECT MIAを指定すると、SQLではこれらのパラメータをASCIWとして渡しますが、MIAはこの方法でパラメータの受渡しを行うように設定されているため、廃止予定の機能を示すメッセージは発行されません。言語を指定しない場合、SQLではこれらのパラメータをASCIW（事前にワードの長さを指定）として渡し、廃止予定の機能を示すメッセージが返されます。
10セッションのデフォルト・キャラクタ・セットおよび各国語キャラクタ・セットがDEC_MCSであると想定しています。
11SQLで表列から仮パラメータにデータが変換されるときに、パラメータの余分な領域は空白で埋められます。ASCIZ文字列を終了させるため、最後の文字または埋められた空白の領域の後に列から受け渡されたヌル文字が挿入されます。