ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

オンライン・サンプル・プログラムsql_all_datatypes.scoには、変数を宣言してSQL文で使用する例が用意されています。また、このプログラムは、様々なSQLデータ定義文およびデータ操作文も示します。SQLをインストールした後、プログラムを出力、入力または検索することにより、様々なトピックに関するサンプル・コードを見つけることができます。

COBOLでは、後ろに文字列が続くワードとして定義された構造体は単一変数として処理されます。この型はVARCHAR(n)に相当します。

4.4.5 サポートされているFORTRAN変数宣言

次のリストは、FORTRANでSQLプリコンパイラがサポートしている文字データ型の変数宣言構文を示しています。

サポートされているキャラクタ・セットの詳細は、第2.1節を参照してください。

次のリストは、FORTRANでSQLプリコンパイラがサポートしている変数宣言構文を示しています。

表4-7 サポートされているFORTRANデータ型
FORTRAN型 SQL型 コメントおよび制限
BYTE TINYINT  
CHARACTER*n CHAR nは正の整数リテラルを示す。
INTEGER INTEGER  
INTEGER*1 TINYINT  
INTEGER*2 SMALLINT  
INTEGER*4 INTEGER  
INTEGER*8 BIGINT OpenVMS Alphaのみ
LOGICAL INTEGER  
LOGICAL*1 TINYINT  
LOGICAL*2 SMALLINT  
LOGICAL*4 INTEGER  
LOGICAL*8 BIGINT OpenVMS Alphaのみ
REAL REAL  
REAL*4 REAL  
REAL*8 DOUBLE PRECISION  
STRUCTURE /name/
  integer*2 len
  character*n body
END STRUCTURE
VARCHAR 名前付き構造体を使用して、他のFORTRANホスト変数を定義できる。構造体のlenコンポーネントは、SQLのパラメータとして使用する前に正しい文字列の長さに設定する必要がある。nは正の整数リテラルを示す。
  SQL_DATE
SQL_DATE_ANSI
SQL_DATE_VMS
SQL_TIME
SQL_TIMESTAMP
SQLプリコンパイラにより、ネイティブFORTRANデータ型の疑似型が変換される。
  SQL_INTERVAL (DAY TO SECOND) 2つの日付または時刻間の差異を示す変数にはこのデータ型を使用する。サポートされているすべてのINTERVALデータ型は、表4-2を参照。

暗黙的な宣言はサポートされていません。暗黙的に宣言された変数がSQL文に使用されると、「host variable was not declared」というエラーが生成されます。

次の例は、SQLで受け入れられるFORTRAN宣言と受け入れられないFORTRAN宣言を示しています。


C SQL will accept:
CHARACTER*1 F1, F2*2 /'XX'/, F3*2345
LOGICAL B1*2/1/
C
C SQL will accept:
REAL D1*4, D2*8
C
C SQL will not accept (REAL declaration bigger than 8 bytes):
REAL D3*16
C SQL will not accept (COMPLEX data type unsupported):
COMPLEX E1*8, E2*16, E3, E4*8(16)
C
C
C SQL will accept:
C host structure:
STRUCTURE /M1_STRUCT/
    STRUCTURE /M11_STRUCT/ M11
        CHARACTER       M111*6, M112*20, M113*6
    END STRUCTURE
    INTEGER             M12*2
    UNION
    MAP
    CHARACTER           M13*15
    END MAP
    MAP
    INTEGER             M13_A*4
    END MAP
    END UNION
END STRUCTURE
C records based on structures:
RECORD /M1_ STRUCT/ M_1, M_2
RECORD /M11_STRUCT/ M_4
C
C
C SQL will accept (indicator array):
INTEGER*4 L1, L2
DIMENSION L1(10), L2(-3:7)
C
C SQL will not accept (dynamic-sized array):
CHARACTER F4*(*)
C SQL will not accept (multidimension array):
INTEGER*2 L5
DIMENSION L5(2,5)
C SQL will not accept (arrays of structures):
RECORD /M1_STRUCT/ M_2(10)

表4-8は、各SQLデータ型についてサポートされるFORTRAN変数宣言の例を示しています。

表4-8 SQLデータ型に対するFORTRAN宣言
SQLの例 FORTRANの例
CHAR(10) CHARACTER*10 STR1
キャラクタ・セットはUNSPECIFIED。
CHAR(10) CHARACTER SET KANJI CHARACTER*10 CHARACTER SET KANJI STR16
VARCHAR(10) CHARACTER*10 STR2
キャラクタ・セットはUNSPECIFIED。
VARCHAR(10) CHARACTER SET KANJI CHARACTER*10 CHARACTER SET KANJI STR26
LONG VARCHAR CHARACTER*16383 STR3
キャラクタ・セットはUNSPECIFIED。
TINYINT LOGICAL*1 NUM11
SMALLINT INTEGER*2 NUM12
INTEGER INTEGER*4 NUM22
BIGINT INTEGER*8 NUM3
FLOAT(6)
FLOAT(25)
REAL*4 NUM4
REAL*8 NUM4または
DOUBLE PRECISION NUM4
REAL REAL*4 NUM5
DOUBLE PRECISION DOUBLE PRECISION NUM6
DATE SQL_DATE DATENUM1
DATE ANSI SQL_DATE_ANSI DATENUM2
DATE VMS SQL_DATE_VMS DATENUM3
TIME SQL_TIME DATENUM4
TIMESTAMP SQL_TIMESTAMP(2) DATENUM5
INTERVAL DAY TO HOUR SQL_INTERVAL (DAY TO HOUR) DATENUM63
LIST OF BYTE VARYING3
CHARACTER*8 STR44


1FORTRANでは、BYTEデータ型はLOGICAL*1のシノニムであり、SQLによって解析されます。
2FORTRANでは、整数データ型でスケール変更係数はサポートされません。
4表4-2は、サポートされているすべてのINTERVALデータ型を示しています。
5FORTRANでは、LIST OF BYTE VARYINGデータ型はサポートしていません。この例は、8バイトの文字列を使用して、セグメント化された文字列識別子、リストの先頭要素のポインタを取得する方法を示しています。このリストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用します。
6文字長およびプリコンパイラの詳細は、第4.4.1項を参照してください。

オンライン・サンプル・プログラムsql_all_datatypes.sfoには、変数を宣言してSQL文で使用する例が用意されています。また、このプログラムは、様々なSQLデータ定義文およびデータ操作文も示します。SQLをインストールした後、プログラムを出力、入力または検索することにより、様々なトピックに関するサンプル・コードを見つけることができます。

注意

FORTRANとともにSQLプリコンパイラを使用する場合、CONTINUATIONS修飾子を使用すると、FORTRANコンパイラでは1文内に最大数の継続行(最大99行)を指定できます。デフォルトの継続行数は19行です。

プログラムにレコード定義が使用される場合、SQLプリコンパイラによってレコードは個別要素に区切られ、各要素は個別行に配置されます。レコード内の要素数が継続行の最大数より大きい場合、FORTRANコンパイラによってエラーが生成されます。

この場合は、FORTRANコマンドラインにCONTINUATIONS修飾子を使用して継続行の最大数を大きくしてください。FORTRANによって許可されている最大数(99要素)より多くの要素がレコードに含まれる場合、中間ファイル(ファイル拡張子.for)を編集し、1行に複数の要素を配置できます。

FORTRANでは、後ろに文字列が続くワードとして定義された構造体は単一変数として処理されます。この型はVARCHAR(n)に相当します。たとえば、次の例の構造体は、単一変数として処理されます。


STRUCTURE /struct_name
        INTEGER*2           length
        CHARACTER*32        string
END STRUCTURE

4.4.6 サポートされているPascal変数宣言

次のリストは、PascalでSQLプリコンパイラによりサポートされている変数宣言構文を示しています。

次の例は、有効なPascal宣言構文を示しています。


var
    pas_date : SQL_TIMESTAMP;
    pas_float: real;
    pas_flt  : single;
    pas_gflo : double;
    pas_int  : integer;
    pas_qword: SQL_BIGINT;
    pas_text : packed array [1..31] of char;
    pas_vtxt : varying [255] of char;
    pas_smal : [word] -32768..32767;

    dateind :  SQL_INDICATOR:=0;
    floaind :  [word] -32768..32767;
    gfloind :  SQL_INDICATOR;
    intind  :  SQL_INDICATOR;
    qind,txtind,vtxtind,smalind : SQL_INDICATOR;

Pascalで無効な宣言構文の例は、次のとおりです。


type
   x     = ^my_rec;  (*forward declarations are not supported*)
   myrec = record
         a: integer;
         b: integer;
   end;

レコードは、それ自体を指し示すことはできません。たとえば、次の宣言はサポートされていません。


foo = record
  a : integer;
  b : SQL_SMALLINT;
  c : ^foo;
end;

bar = record
   a : integer;
   b : integer
   c : bar;

SQLプリコンパイラは、次をサポートしていません。

次の例は、Pascalのホスト言語文に埋め込まれたSQL文を示しています。読みやすくするために、Pascalのすべてのホスト言語文は小文字で記述されており、SQLデータ型および埋込みSQL文はすべて大文字で記述されています。


label
        leap_frog;

begin


dmp_alldtps;
insert_some_data;
dmp_alldtps;
EXEC SQL OPEN DTPS;
EXEC SQL FETCH DTPS INTO
        :PAS_DATE :DATEIND,
        :PAS_FLT:FLOAIND,
        :PAS_GFLO INDICATOR :GFLOIND,
        :PAS_INT:INTIND,
        :PAS_QWORD :QIND,
        :PAS_TEXT INDICATOR :TXTIND,
        :PAS_VTXT :VTXTIND,
        :PAS_SMAL INDICATOR :SMALIND ;
writeln('single  ',pasflt);
EXEC SQL CLOSE DTPS;

(*Note that an SQL statement can reside on the same line as a label*)
leap_frog: EXEC SQL ROLLBACK;

end.

Pascalのホスト言語プログラムに埋め込まれたSQL文はすべてセミコロン(;)で終わる必要があります。つまり、elseアクションの前にSQL文を配置するには、このSQL文をbegin/endブロックで囲む必要があります。


if budget_actual < budget_total
then
    begin
    EXEC SQL INSERT ...;
    end
else

オンライン・サンプル・プログラムsql_all_datatypes.spaには、変数を宣言してSQL文で使用する例が用意されています。また、このプログラムは、様々なSQLデータ定義文およびデータ操作文も示します。SQLをインストールした後、プログラムを出力、入力または検索することにより、様々なトピックに関するサンプル・コードを見つけることができます。

次の例は、サンプル・プログラムsql_all_datatypes.spaをプリコンパイル、リンクおよび実行するコマンドを示しています。


$ SQLPRE :== $SQL$PRE
$ SQLPRE sql_all_datatypes/PASCAL
$ LINK sql_all_datatypes
$ RUN sql_all_datatypes
.
.
.
  Setting up the database.
  Declaring the schema.
  Declaring the cursor.
  Inserting data into table.

These are the stored rows:
-


date_ind =          0
pas_date     = 12-OCT-1988
pas_float    =  9.69600E+01
pas_gfloat   =  1.000000000000E+008
pas_int      = 2147483647
pas_qword l0 =    5000000
pas_qword l1 =          0
pas_text     = text in a packed array
pas_vartxt   = varying text
pas_small    =         19


date_ind =          0
pas_date     = 12-OCT-1988
pas_float    =  9.69600E+01
pas_gfloat   =  1.000000000000E+008
pas_int      = 2147483647
pas_qword    = null
pas_text     = Changed the text
pas_vartxt   = varying text
pas_small    =         19
single   9.69600E+01

表4-9は、各SQLデータ型についてサポートされるPascal変数宣言の例を示しています。

表4-9 SQLデータ型に対するPascal宣言
SQLの例 Pascalの例
LONG VARCHAR SQL_LONG_VARCHAR;1
TINYINT SQL_TINYINT;2
SMALLINT SQL_SMALLINT;3
SMALLINT SQL_INDICATOR;4
SMALLINT [WORD] --32768..32767;
BIGINT SQL_BIGINT;5
INTEGER INTEGER;
REAL REAL;
REAL SINGLE;
REAL F_FLOAT;
REAL S_FLOAT;
DOUBLE PRECISION DOUBLE;
DOUBLE PRECISION D_FLOAT;
DOUBLE PRECISION G_FLOAT;
DOUBLE PRECISION T_FLOAT;
CHAR/CHAR(1) CHAR;
CHARACTER(n) PACKED ARRAY [1..n] OF CHAR;
VARCHAR(u) VARYING [u] OF CHAR;
DATE SQL_DATE;
DATE ANSI SQL_DATE_ANSI;
DATE VMS SQL_DATE_VMS;
TIME SQL_TIME(0);
TIMESTAMP SQL_TIMESTAMP(2);
INTERVAL YEAR TO MONTH SQL_INTERVAL (YEAR TO MONTH);6
INTERVAL DAY TO HOUR SQL_INTERVAL (DAY TO HOUR);6
LIST OF BYTE VARYING
PACKED ARRAY [1..8] OF CHAR7


1SQL_LONG_VARCHARは、[HIDDEN] VARYING [16383] OF CHAR;まで対象に含みます。
2SQL_TINYINTは、[HIDDEN, BYTE] --128..127;まで対象に含みます。
3SQL_SMALLINTは、[HIDDEN, WORD] --32678..32767;まで対象に含みます。
4SQL_INDICATORは、[HIDDEN, WORD] --32678..32767;まで対象に含みます。
5SQL_BIGINTは、BIGINTを指定する唯一の方法です。SQL_BIGINTは、[HIDDEN, QUAD, UNSAFE] RECORD L0:INTEGER;L1:INTEGER END;まで対象に含みます。これにより、variable.L0およびvariable.L1によって各ピースを参照できるようになります。
6表4-2は、サポートされているすべてのINTERVALデータ型を示しています。
7Pascalは、LIST OF BYTE VARYINGデータ型はサポートしていません。この例は、8バイトの文字列を使用して、セグメント化された文字列識別子、リストの先頭要素のポインタを取得する方法を示しています。(必要に応じて、BIGINTも使用できます。)このリストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用します。

注意

SQL用のPascalプリコンパイラでは、レコードの配列の宣言を解析すると、不適切な%SQL-I-UNMATENDエラーが発生します。ENDはレコード定義とは関連付けられないため、ホスト変数の有効範囲が混乱し、致命的エラーが発生します。

この問題を回避するには、レコードを型として宣言し、この型の配列を定義します。次に例を示します。



    main.spa:

        program main (input,output);

        type
        exec sql include 'bad_def.pin';    !gives error
        exec sql include 'good_def.pin';   !ok
        var
            a : char;

        begin
        end.

---------------------------------------------------------------
    bad_def.pin

    x_record = record
    y  : char;
    variable_a:  array [1..50] of record
                a_fld1 : char;
                b_fld2  : record;
                            t : record
                                      v : integer;
                            end;
                end;
        end;
    end;
---------------------------------------------------------------

    good_def.pin

good_rec = record
        a_fld1 : char;
        b_fld2 : record
                t : record
                        v: integer;
                end;
        end;
end;

    x_record = record
        y  : char
        variable_a : array [1..50] of good_rec;
    end;