オンライン・サンプル・プログラムsql_all_datatypes.scoには、変数を宣言してSQL文で使用する例が用意されています。また、このプログラムは、様々なSQLデータ定義文およびデータ操作文も示します。SQLをインストールした後、プログラムを出力、入力または検索することにより、様々なトピックに関するサンプル・コードを見つけることができます。
COBOLでは、後ろに文字列が続くワードとして定義された構造体は単一変数として処理されます。この型はVARCHAR(n)に相当します。
4.4.5 サポートされているFORTRAN変数宣言
次のリストは、FORTRANでSQLプリコンパイラがサポートしている文字データ型の変数宣言構文を示しています。
サポートされているキャラクタ・セットの詳細は、第2.1節を参照してください。
次のリストは、FORTRANでSQLプリコンパイラがサポートしている変数宣言構文を示しています。
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変数宣言の例を示しています。
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 |
オンライン・サンプル・プログラム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 |
次のリストは、PascalでSQLプリコンパイラによりサポートされている変数宣言構文を示しています。
また、SQL Pascalプリコンパイラには、次のデータ型も用意されています。
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プリコンパイラは、可変レコードはサポートしていません。
dateind : SQL_INDICATOR:=0; |
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) |
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; |
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変数宣言の例を示しています。
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 |
SQL用のPascalプリコンパイラでは、レコードの配列の宣言を解析すると、不適切な%SQL-I-UNMATENDエラーが発生します。ENDはレコード定義とは関連付けられないため、ホスト変数の有効範囲が混乱し、致命的エラーが発生します。 この問題を回避するには、レコードを型として宣言し、この型の配列を定義します。次に例を示します。
|