$ ACS CREATE LIBRARY [.ADALIB]
$ ACS SET LIBRARY [.ADALIB]
$ SQLPRE == "$SQL$PRE"
$ SQLPRE
INPUT FILE> sql_all_datatypes.sqlada/ADA
$ ! This LINK command requires that the logical name
$ ! LNK$LIBRARY is defined as SYS$LIBRARY:SQL$USER.OLB.
$ ACS LINK sql_all_datatypes sql_sql_all_datatypes.obj
$ RUN sql_all_datatypes.exe
.
.
.
This is the stored row
CHAR_COL: Begin end
SMALLINT_COL: -32768
INTEGER_COL: -2147483648
REAL_COL: 0.12346
DOUBLE_PRECISION_COL: 0.12345678901234
DATE_COL: 30-OCT-1987 09:00:00.00
VARCHAR_COL: This string is 39 characters in length.
.
.
.
This is the row after update
CHAR_COL: NULL
SMALLINT_COL: 32767
INTEGER_COL: 2147483647
REAL_COL: 0.12346
DOUBLE_PRECISION_COL: 0.12345678901234
DATE_COL: 10/30/87 09:00:00
VARCHAR_COL: This string is 39 characters in length.
|
Adaプリコンパイラを使用する場合、サブプログラムごとに一意のプロシージャ名を使用する必要があります。プログラムの様々なサブプログラムに同じプロシージャ名が使用される場合、いくつかの代替方法があります。
|
次のリストは、CでSQLプリコンパイラがサポートしている文字データ型の変数宣言構文を示しています。
サポートされているキャラクタ・セットの詳細は、第2.1節を参照してください。
次のリストは、CでSQLプリコンパイラがサポートしている変数宣言構文を示しています。
特にリモート・データベースにアクセスする場合、charポインタ変数にこのように大きなメモリーを割り当てると、メモリーが無駄になり、パフォーマンスが低下するため、これらのケースではcharポインタ変数を使用しないでください。
a_var[10];
$SQL_VARCHAR(10) x,y,z;
int SQLCODE;
struct
{
char b_var[5];
short int c_var;
} a_record;
union
{
char string_date[17];
struct
{
char year_var1[2];
char year_var2[2];
char month_var[2];
char day_var[2];
char hour_var[2];
char minute_var[2];
char second_var[2];
char hundredth_var[2];
} date_group;
} date_union;
int indicator_item[2];
globaldef double c_var;
static d_var;
char *x;
|
| C型または typedef |
SQL型 |
コメントおよび制限 |
|---|---|---|
| char | CHARACTER | |
| char * | LONG VARCHAR | VARCHAR(16383)と想定される。 |
| char [n] | CHARACTER | nは整数リテラルである必要がある。#defineの名前または式はサポートされない。 |
| int | INTEGER | 符号なしでは指定できない。 |
| short | SMALLINT | 符号なしでは指定できない。 |
| short int | INTEGER | 符号なしでは指定できない。 |
| long int | INTEGER | 符号なしでは指定できない。 |
| float | REAL | |
| double | DOUBLE PRECISION | |
| enum | INTEGER | |
| long | INTEGERまたはBIGINT | OpenVMSの場合、longデータ型は32ビットである。 |
| int8 | TINYINT | #include <ints.h> が必要である。 |
| int16 | SMALLINT | #include <ints.h> が必要である。 |
| __int16 | SMALLINT | |
| int32 | INTEGER | #include <ints.h> が必要である。 |
| __int32 | INTEGER | |
| int64 | BIGINT | OpenVMS Alphaプラットフォームのみ。 #include <ints.h> が必要である。 |
| __int64 | BIGINT | |
| $SQL_VARCHAR (n) | CHARACTER SET句はオプションである。 | |
| SQL_DATE SQL_DATE_ANSI SQL_DATE_VMS SQL_TIME SQL_TIMESTAMP |
SQLプリコンパイラにより、ネイティブCデータ型の疑似型が変換される。 | |
| SQL_INTERVAL (DAY TO SECOND) | 2つの日付または時刻間の差異を示す変数にはこのデータ型を使用する。サポートされているすべてのINTERVALデータ型は、表4-2を参照。 |
サポートされていない一部の構文は、SQL操作では重要でない場合、受け入れられますが、無視されます。たとえば、記憶域クラス修飾子の実装は、SQL操作では重要でないとみなされます。このような修飾子は宣言では受け入れられますが、無視されます。一方、SQLで変数を正しく使用するには、SQLによってデータ型構文の実装が解釈される必要があります。このため、SQLで列挙データ型がサポートされていないときに宣言にキーワードenumが含まれる場合、宣言は無効とみなされます。すべての無効な宣言について、宣言自体の後にエラーが返されるのではなく、この宣言を参照するSQL文の後にエラーが返されます。#defineディレクティブは認識されません。たとえば、{および}をBEGINおよびENDとする定義はサポートされていません。無効な宣言構文の例は、次のとおりです。各宣言の後ろにあるコメントは、宣言によって指定された変数や、宣言に依存する変数をSQL文で参照できない理由を示しています。
int indicator_item[]; /* implicit dimension for array */
char func_ret(); /* function return status */
int mult_arr[5][10]; /* multidimensional array */
unsigned int uns_var; /* unsigned data */
int bit3 : 4, bit4 : 3; /* bit fields */
enum {a, b, c} enum_var; /* enumerated data type */
char *a_prt[5]; /* array of pointers */
int **x; /* two levels of pointers */
struct x_rec *x /* pointer to structures */
foo (char *x, int y) /* declarations within functions */
|
表4-5は、各SQLデータ型についてサポートされるC変数宣言の例を示しています。
| SQLの例 | Cの例 |
|---|---|
| CHAR(10) | char str1[11] SQLでは、文字列はASCIZ形式と想定される。このため、CHAR列のcharホスト言語変数は列サイズより1文字多いものとして宣言する。(これにより、ASCIZ文字列の最後にヌル文字用の空白を確保できる。)データ・ディクショナリから定義をコピーするときに、SQL INCLUDE文にFIXED引数を指定して、必要に応じてこの制限を回避できる。 キャラクタ・セットはUNSPECIFIED。 |
| CHAR(10) CHARACTER SET KANJI | char CHARACTER SET KANJI str[11]1 このデータ型は、キャラクタ・セットがCHARACTER SET句で指定されているという点以外は、charと同じ特性を持つ。 |
| VARCHAR(10) | $SQL_VARCHAR(10) typedef $SQL_VARCHAR(max_length_of_varchar)を使用する場合、ワードの長さを示すホスト言語変数(len)を定義するマクロがファイルの先頭で宣言され、データのバイト数(data)がこの後ろに続く。この例では、lenの後ろに10バイトのデータが続く。バイナリ・データを格納して渡すために適したC変数宣言としてSQLでサポートされているのは、この宣言のみである。 キャラクタ・セットはUNSPECIFIED。 |
| VARCHAR(10) CHARACTER SET KANJI | $SQL_VARCHAR(10) CHARACTER SET KANJI str1 このデータ型は、キャラクタ・セットがCHARACTER SET句で指定されているという点以外は、$SQL_VARCHARと同じ特性を持つ。 |
| LONG VARCHAR | char str3[16384] SQLでは、文字列はASCIZ形式と想定されるため、ヌル文字列終端文字を使用して、LONG VARCHAR列に格納されている値の長さが確認される。このため、LONG VARCHARデータ型のホスト言語変数は、固定長のchar変数として宣言する。この変数は、列で使用可能な最長の有効文字列にヌル終端文字用の1文字を加えた長さに対応できる必要がある。 キャラクタ・セットはUNSPECIFIED。 |
| TINYINT | char num1 SQLではTINYINT列に対するスケール変更係数をサポートしているが、Cではサポートしていない。 |
| SMALLINT | short num1 SQLではSMALLINT列に対するスケール変更係数をサポートしているが、Cではサポートしていない。SMALLINT列をスケール変更する場合、変数はshortではなくfloatとして宣言する。 |
| INTEGER | long num2 SQLではINTEGER列に対するスケール変更係数をサポートしているが、Cではサポートしていない。INTEGER列をスケール変更する場合、変数はintではなくdoubleとして宣言する。 |
| BIGINT | double num3 CではBIGINTデータ型をサポートしていない。Cデータ型のdoubleは、スケール変更するBIGINT列とスケール変更しないBIGINT列の両方に適しており、変換はSQLによって実行される。ただし、doubleデータ型の場合、BIGINT列に格納可能なより大きい値の近似処理のみが行われる。 |
| FLOAT(6) FLOAT(25) |
float num4 double num4 |
| REAL | float num5 |
| DOUBLE PRECISION | double num6 |
| DATE | SQL_DATE datenum1 |
| DATE ANSI | SQL_DATE_ANSI datenum2 |
| DATE VMS | SQL_DATE_VMS datenum3 |
| TIME | SQL_TIME datenum4 |
| TIMESTAMP | SQL_TIMESTAMP datenum5 |
| INTERVAL DAY TO HOUR | SQL_INTERVAL (DAY TO HOUR) datenum6 サポートされているすべてのINTERVALデータ型は、表4-2を参照。 |
| LIST OF BYTE VARYING | char datenum[8] Cでは、LIST OF BYTE VARYINGデータ型はサポートしていない。LIST OF BYTE VARYING列に対して8バイトの文字変数を宣言すると、リストの先頭要素を指し示す、セグメント化された文字列識別子を格納するために十分な空白が確保される。このリストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用できる。 |
オンライン・サンプル・プログラムsql_all_datatypes.scには、変数を宣言してSQL文で使用する例が用意されています。また、このプログラムは、様々なSQLデータ定義文およびデータ操作文も示します。SQLをインストールした後、プログラムを出力、入力または検索することにより、様々なトピックに関するサンプル・コードを見つけることができます。
次の制限はC変数に適用されます。
%SQL-F-BAD_ARRAY, Host variable address contains an array syntax error in its declaration. |
たとえば、宣言に名前付きの定数または式が含まれる場合、このエラーが発生します。
#define NAME_LEN (20)
#define ADDRESS_LEN (31)
char name [NAME_LEN + 1] /* This cannot be used */
char address [ADDRESS_LEN] /* This cannot be used */
|
この場合、2段階のアクションが必要となる解決策があります。
#define NAME_LEN 21
#define ADDRESS_LEN 31
char name [NAME_LEN]
char address [ADDRESS_LEN]
|
CC/PREPROCESS=filename.SCP filename.SC SQL$PRE/CC filename.SCP |
次のリストは、COBOLでSQLプリコンパイラがサポートしている文字データ型の変数宣言構文を示しています。
サポートされているキャラクタ・セットの詳細は、第2.1節を参照してください。
次のリストは、COBOLでSQLプリコンパイラがサポートしている変数宣言構文を示しています。
* Declaration for an SQL column
* defined as VARCHAR (80):
*
01 VARYING_STRING.
49 STRING_LENGTH PIC S9(4) USAGE IS COMP.
49 STRING_TEXT PIC X(80).
|
これらのデータ型は、コンパイラ自体でサポートされているホスト言語データ宣言に置き換えられます。
次の例は、SQLで受け入れられるCOBOL宣言と受け入れられないCOBOL宣言を示しています。
* SQL will accept:
01 A PIC S9(7)V99 COMP.
* SQL will not accept (unsigned numeric):
01 B PIC 9(7)V99 COMP.
*
*
* SQL will accept:
01 C COMP-1 VALUE IS -1.
* SQL will not accept (implicit USAGE IS DISPLAY):
01 E PIC S9(4).
*
*
* SQL will accept:
01 indicators-x.
05 indicator-null pic s9(9) comp occurs 40.
* SQL will not accept
01 indicators-x.
05 indicator-null pic s9(9) comp occurs 40 indexed by x1.
*
* SQL will accept (host structure and indicator array):
01 F EXTERNAL.
02 F1 PIC S9(9) COMP.
02 F2 PIC X(20).
02 F2_R REDEFINES F2.
03 G1 PIC X(10).
03 G2 COMP-2.
02 F3 PIC S9(9) COMP.
01 F_IND_ARRAY
02 F_IND OCCURS 3 TIMES PIC S9(9) COMP.
|
表4-6は、各SQLデータ型についてサポートされるCOBOL変数宣言の例を示しています。
| SQLの例 | COBOLの例 |
|---|---|
| CHAR(10) | 01 STR1 PICTURE X(10). キャラクタ・セットはUNSPECIFIED。 |
| CHAR(10) CHARACTER SET KANJI | 01 STR1 CHARACTER SET KANJI PICTURE X(10).5 |
| VARCHAR(80) | 01 STR2. 49 STR2L PICTURE S9(4) COMP. 49 STR2C PICTURE X(80). キャラクタ・セットはUNSPECIFIED。 |
| VARCHAR(80) CHARACTER SET KANJI | 01 STR2. 49 STR2L PICTURE S9(4) COMP. 49 STR2C CHARACTER SET KANJI PICTURE X(80).5 |
| LONG VARCHAR | 01 STR3. 49 STR3L PICTURE S9(4) COMP. 49 STR3C PICTURE X(16383). キャラクタ・セットはUNSPECIFIED。 |
| TINYINT(2) TINYINT |
COBOLではサポートされない。 COBOLではサポートされない。 |
| SMALLINT(2) SMALLINT |
01 NUM1 PICTURE S99V99 COMP. 01 NUM1 PICTURE S9(4) COMP. |
| INTEGER(2) INTEGER |
01 NUM2 PICTURE S9(7)V99 COMP. 01 NUM2 PICTURE S9(9) COMP. |
| BIGINT(2) BIGINT |
01 NUM3 PIC S9(16)V99 COMP. 01 NUM3 PIC S9(18) COMP. |
| FLOAT(6) FLOAT(25) |
01 NUM4 COMP-1. 01 NUM4 COMP-2.1 |
| REAL | 01 NUM5 COMP-1. |
| DOUBLE PRECISION | 01 NUM6 COMP-2.2 |
| DATE | 01 DATENUM1 SQL_DATE. |
| DATE ANSI | 01 DATENUM2 SQL_DATE_ANSI. |
| DATE VMS | 01 DATENUM3 SQL_DATE_VMS. |
| TIME | 01 DATENUM4 SQL_TIME(0). |
| TIMESTAMP | 01 DATENUM5 SQL_TIMESTAMP(2). |
| INTERVAL DAY TO HOUR | 01 DATENUM6 SQL_INTERVAL (DAY TO HOUR).3 |
| LIST OF BYTE VARYING | 01 STR4 PICTURE X(8).4 |