モジュールの仮パラメータに指定される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データ型を示します。
仮パラメータのデータ型 | 必要となる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 |
次の表は、各SQL仮パラメータのデータ型、およびSQLで受け入れられる対応する実パラメータの特定のホスト言語での宣言の例を示しています。
表3-3は、SQL仮パラメータに対するAda宣言を示しています。SQLモジュール言語で使用可能なAdaパッケージの詳細は、この項の最後にある「使用方法」を参照してください。SQL_STANDARD Adaパッケージにより、ANSI/ISO SQL規格でサポートされているデータ型が定義されます。
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 |
表3-4は、Ada宣言および浮動小数点の書式を示しています。
Ada宣言 | 互換性のあるSQL$MOD宣言 |
---|---|
pragma FLOAT_REPRESENTATION VAX_FLOAT |
$SQL$MOD/ADA/FLOAT=G_FLOAT - or |
pragma FLOAT_REPRESENTATION VAX_FLOAT |
$SQL$MOD/ADA/FLOAT=G_FLOAT |
pragma FLOAT_REPRESENTATION VAX_FLOAT |
$SQL$MOD/ADA/FLOAT=D_FLOAT |
... |
$SQL$MOD/ADA/FLOAT=D_FLOAT |
... |
$SQL$MOD/ADA/FLOAT=G_FLOAT |
... |
$SQL$MOD/ADA/FLOAT=IEEE_FLOAT |
表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 |
表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 |