ヘッダーをスキップ

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

戻る | 次へ |

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

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

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

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

- CHARACTER

- CHARACTER character-set-name

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

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

- 宣言: 表4-7を参照してください。

- 宣言に割り当てられる初期値

- STRUCTURE宣言

- 構造体内のUNION宣言

- RECORD文

- DIMENSION文

  - DIMENSION文は、インジケータ配列の宣言でのみ使用できます。インジケータ配列要素にはすべてのデータ型を使用できますが、Oracle Rdbでは、INTEGERデータ型の変数を使用することをお薦めします。

  - 多次元配列および動的サイズ配列はサポートされていません。

表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データ型のみ含めることができます。

  - INTEGER8、INTEGER16、INTEGER32およびINTEGER64

  - REAL

  - SINGLE

  - DOUBLE

  - F_FLOAT

  - D_FLOAT

  - G_FLOAT

  - S_FLOAT

  - T_FLOAT

  - CHAR

  - PACKED ARRAY [1..n] OF CHAR;

  - VARYING [u] OF CHAR

  - [BYTE] --128..127;

  - [WORD] --32768..32767;

  - 日時データ型（これらのデータ型は、表4-2を参照。）

  また、SQL Pascalプリコンパイラには、次のデータ型も用意されています。

  - SQL_LONG_VARCHAR

  - SQL_DATE

  - SQL_SMALLINT

  - SQL_INDICATOR

  - SQL_BIGINT

  - SQL_QUAD

  - SQL_DATE、SQL_DATE_ANSI、SQL_DATE_VMS

  - SQL_TIME、SQL_TIMESTAMP

  - SQL_INTERVAL (DAY TO SECOND)
    2つの日付または時刻間の差異を示す変数にはこのデータ型を使用します。（サポートされているすべてのINTERVALデータ型は、表4-2を参照してください。）

- レコード
  SQLプリコンパイラは、Pascalレコード定義をサポートしています。また、SQLプリコンパイラは、次のようなネストされたレコードもサポートしています。

      type_record_type = record
          employee_id :   employee_id_str;
          last_name   :   last_name_str;
          first_name  :   first_name_str;
          middle_init :   middle_init_str;
          address_dat1:   address_str;
          address_dat2:   address_str;
          city        :   city_str;
          state       :   state_str;
          postal_code :   postal_code_str;
          sex         :   sex_str;
          status_code :   status_code_str;
      end;

      name_rec = record
          last_name   :   last_name_str;
          first_name  :   first_name_str;
          middle_init :   middle_init_str;
      end;

      address_rec = record
          address_dat1    :   address_str;
          address_dat2    :   address_str;
          city            :   city_str;
          state           :   state_str;
          postal_code     :   postal_code_str;
      end;

      rec_in_rec = record
          employee_id :   employee_id_str;
          emp_name    :   name_rec;
          emp_addr    :   address_rec;
          sex         :   sex_str;
          status_code :   status_code_str;
      end;

      rec_in_rec_in_rec = record
          nested_again :   rec_in_rec;
      end;

  SQL文で使用されるレコードには、別のレコードへのポインタを含めることはできません。
  SQLプリコンパイラは、可変レコードはサポートしていません。

- 初期値代入
  SQLプリコンパイラは、宣言に割り当てられる初期値をサポートしています。

      dateind : SQL_INDICATOR:=0;

- 配列
  SQL文字列を宣言するために、パック配列がサポートされています。
  SQL文の構造体を参照するインジケータ配列を宣言するために、単次元配列がサポートされています。配列の要素は、ワード整数[WORD]--32768..32767またはSQL_INDICATORとして宣言する必要があります。

- ポインタ
  Pascal用のSQLプリコンパイラは、1レベルのポインタをサポートしています。

      type
            a = ^integer;

      var
            b :  a;  (* the use of the variable b is supported  *)
            c : ^a;  (* do not use any form of variable c in an SQL statement)

次の例は、有効な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プリコンパイラは、次をサポートしていません。

- [HIDDEN]以外の属性

- 範囲

次の例は、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;