4.4 プリコンパイラでサポートされているホスト言語変数宣言
SQLプリコンパイラでは、有効なホスト言語変数宣言のサブセットのみが認識されます。埋込みSQL文で認識されない変数宣言を参照すると、この参照が行われたときに致命的エラーが発生します。
SQLプリコンパイラでサポートされているOracle Rdbデータベースおよび様々なホスト言語では、必ずしも同じデータ型セットがサポートされるとはかぎりません。プリコンパイラでは、SQLデータ型に相当するホスト言語変数宣言に加えて、他のホスト言語変数宣言のサブセットが認識されます。
CREATE TABLE TESTTBL (
KEYFIELD CHAR(10) PRIMARY KEY,
FLOAT1 REAL,
FLOAT2 DOUBLE PRECISION);
|
| モジュール言語と対話型SQL | プリコンパイラ |
|---|---|
| DATE | SQL_DATE |
| DATE_ANSI | SQL_DATE_ANSI |
| DATE_VMS | SQL_DATE_VMS |
| TIME | SQL_TIME |
| TIMESTAMP | SQL_TIMESTAMP |
| INTERVAL YEAR | SQL_INTERVAL (YEAR) |
| INTERVAL YEAR TO MONTH | SQL_INTERVAL (YEAR TO MONTH) |
| INTERVAL MONTH | SQL_INTERVAL (MONTH) |
| INTERVAL DAY | SQL_INTERVAL (DAY) |
| INTERVAL DAY TO HOUR | SQL_INTERVAL (DAY TO HOUR) |
| INTERVAL DAY TO MINUTE | SQL_INTERVAL (DAY TO MINUTE) |
| INTERVAL DAY TO SECOND | SQL_INTERVAL (DAY TO SECOND) |
| INTERVAL HOUR | SQL_INTERVAL (HOUR) |
| INTERVAL HOUR TO MINUTE | SQL_INTERVAL (HOUR TO MINUTE) |
| INTERVAL HOUR TO SECOND | SQL_INTERVAL (HOUR TO SECOND) |
| INTERVAL MINUTE | SQL_INTERVAL (MINUTE) |
| INTERVAL MINUTE TO SECOND | SQL_INTERVAL (MINUTE TO SECOND) |
| INTERVAL SECOND | SQL_INTERVAL (SECOND) |
次の項では、SQLで認識される有効なホスト言語変数宣言のサブセットを示します。また、これらの項では、各SQLデータ型に相当する有効な宣言の例と、プリコンパイラによって認識されるおよび認識されない他の宣言の例も示します。
ANSI/ISO SQL規格で、埋込みSQL文で使用される変数は、埋め込まれたSQL BEGIN DECLARE...END DECLARE文のペアの内部で宣言する必要があると指定されています。Oracle Rdb SQLプリコンパイラでは、この制限は施行されません。BEGIN DECLARE...END DECLARE文を使用する場合、BEGIN DECLARE...END DECLAREブロックの外部で宣言された変数が検出されると、警告メッセージが表示されます。 アプリケーションでANSI/ISO SQLに準拠することが重要な場合は、埋込みSQL文で使用する変数の宣言をすべてBEGIN DECLARE...END DECLAREブロック内に含める必要があります。BEGIN DECLARE文の詳細は、SQLモジュール言語に関する「BEGIN DECLARE文」を参照してください。 |
次の各項では、SQLモジュール言語プロシージャに対するホスト言語プログラム・コールの実パラメータとして使用されるホスト言語変数宣言に関する要件については説明しません。このようなホスト言語変数宣言は、SQLモジュール・ファイル内の対応する仮パラメータ宣言に正確に対応している必要があります。対応していない場合は、実行時に予期しない結果が生じる可能性があります。SQLモジュール言語の詳細は、第3章を参照してください。
4.4.1 文字パラメータの長さの指定
文字変数の長さを正しく指定するには、次のガイドラインを使用します。
各キャラクタ・セットで1文字に使用されるオクテット数の詳細は、表2-2を参照してください。
次のキャラクタ・セットを使用してMIA_CHAR_SETデータベースを作成するとします。
データベースにはCOLOURS表が含まれ、この表の列が次の例のように定義されるとします。
SQL> SHOW DOMAINS;
User domains in database with filename MIA_CHAR_SET
ARABIC_DOM CHAR(8)
ISOLATINARABIC 8 Characters, 8 Octets
DEC_KANJI_DOM CHAR(16)
GREEK_DOM CHAR(8)
ISOLATINGREEK 8 Characters, 8 Octets
HINDI_DOM CHAR(8)
DEVANAGARI 8 Characters, 8 Octets
KANJI_DOM CHAR(8)
KANJI 4 Characters, 8 Octets
KATAKANA_DOM CHAR(8)
KATAKANA 8 Characters, 8 Octets
MCS_DOM CHAR(8)
DEC_MCS 8 Characters, 8 Octets
RUSSIAN_DOM CHAR(8)
ISOLATINCYRILLIC 8 Characters, 8 Octets
SQL> --
SQL> SHOW TABLE (COLUMNS) COLOURS;
Information for table COLOURS
Columns for table COLOURS:
Column Name Data Type Domain
----------- --------- ------
ENGLISH CHAR(8) MCS_DOM
DEC_MCS 8 Characters, 8 Octets
FRENCH CHAR(8) MCS_DOM
DEC_MCS 8 Characters, 8 Octets
JAPANESE CHAR(8) KANJI_DOM
KANJI 4 Characters, 8 Octets
ROMAJI CHAR(16) DEC_KANJI_DOM
KATAKANA CHAR(8) KATAKANA_DOM
KATAKANA 8 Characters, 8 Octets
HINDI CHAR(8) HINDI_DOM
DEVANAGARI 8 Characters, 8 Octets
GREEK CHAR(8) GREEK_DOM
ISOLATINGREEK 8 Characters, 8 Octets
ARABIC CHAR(8) ARABIC_DOM
ISOLATINARABIC 8 Characters, 8 Octets
RUSSIAN CHAR(8) RUSSIAN_DOM
ISOLATINCYRILLIC 8 Characters, 8 Octets
|
プリコンパイルされたSQLプログラムでCHARACTER LENGTH CHARACTERSを指定する場合、次のCの例のように、対応する変数を宣言します。
.
.
.
/* Specify CHARACTER LENGTH CHARACTERS in the DECLARE MODULE statement.
In addition, specify the IDENTIFIER, NATIONAL, and DEFAULT character sets.
*/
exec sql DECLARE MODULE CCC_COLOURS
NAMES ARE DEC_KANJI
NATIONAL CHARACTER SET KANJI
SCHEMA RDB$SCHEMA
AUTHORIZATION SQL_SAMPLE
CHARACTER LENGTH CHARACTERS
DEFAULT CHARACTER SET DEC_KANJI
ALIAS RDB$DBHANDLE;
/* If you do not specify character sets in the DECLARE ALIAS statement, SQL
* uses the character sets of the compile-time database.
*/
exec sql DECLARE ALIAS FILENAME mia_char_set;
/* When you declare a parameter with lowercase char, SQL considers the
* character set unspecified and allocates single-octet characters.
*/
char english_p[31];
/* When you specify the character set, SQL allocates single- or multi-octet
* characters, depending upon the character set.
*/
char CHARACTER SET DEC_MCS french_p[31];
char CHARACTER SET KANJI japanese_p[31];
char CHARACTER SET DEC_KANJI dec_kanji_p[31];
.
.
.
|
ホスト言語変数は、直接宣言したり、Adaパッケージ(SQL_STANDARD)をコールして宣言できます。
ANSI/ISO SQL規格に準拠する必要がある場合は、SQL_STANDARDパッケージを使用する必要があります。このパッケージにより、ANSI/ISO SQL規格でサポートされているデータ型が定義されます。このパッケージを使用するには、最初にSYS$COMMON:[SYSLIB]SQL$STANDARD.ADAファイルを独自のAdaライブラリにコピーし、次にパッケージをコンパイルします。
SQL_STANDARDパッケージにより、次のANSI規格のデータ型が宣言されます。
アプリケーションがANSI/ISO SQLに準拠していることが重要でない場合は、ホスト言語変数を直接宣言できます。次のリストは、AdaでSQLプリコンパイラがサポートしている変数宣言構文を示しています。
/FLOAT修飾子とともに/ADA修飾子を使用する場合、ADAコマンドには/FLOAT修飾子がないため、SQL$PREでは警告(%SQL-W-NOFLOAT)が発行されます。ただし、FLOAT REPRESENTATIONプラグマを使用してデフォルトの浮動小数点形式をオーバーライドする場合、SQL$PREではこのプラグマが認識されないため、/FLOAT修飾子を使用してSQL$PREにこの浮動小数点形式を認識させる必要があります。この警告はそのまま無視してください。SQL$PREでは、IEEE形式がサポートされているのみならず、VAX_FLOATを指定するFLOAT REPRESENTATIONプラグマとD_FLOATを指定するLONG FLOATプラグマの組合せを使用して、64ビットの浮動小数点型用のデフォルトのG_FLOAT形式をオーバーライドすることもできます。この組合せを使用するには、/FLOAT=D_FLOATのSQL$PRE修飾子を指定します。 |
PRAGMA FLOAT REPRESENTATION IEEE_FLOAT;
WITH SYSTEM; USE SYSTEM;
WITH STANDARD; USE STANDARD;
WITH SQL_STANDARD; USE SQL_STANDARD;
...
PROCEDURE TESTIT IS
EXEC SQL BEGIN DECLARE SECTION;
KEYFIELD : STRING(1..10);
FLOATER : LONG_FLOAT; -- package STANDARD
SQLFLOATER : REAL; -- package SQL_STANDARD
GFLOATER : G_FLOAT; -- package SYSTEM
SFLOATER : IEEE_SINGLE_FLOAT; -- package SYSTEM
TFLOATER : IEEE_DOUBLE_FLOAT; -- package SYSTEM
EXEC SQL END DECLARE SECTION;
...
BEGIN
...
KEYFIELD := "1.0 ";
EXEC SQL SELECT FLOAT1, FLOAT2 INTO :SQLFLOATER, :GFLOATER
WHERE KEYFIELD = :KEYFIELD;
...
KEYFIELD := "2.0 ";
EXEC SQL SELECT FLOAT1, FLOAT2 INTO :SFLOATER, :TFLOATER
WHERE KEYFIELD = "KEYFIELD;
...
KEYFIELD := "3.0 ";
EXEC SQL SELECT FLOAT1, FLOAT2 INTO :FLOATER, TFLOATER
WHERE KEYFIELD = KEYFIELD;
|
Oracle Rdbには、事前に通知することなく、日時データ型の変換によって生成されたコードをいつでも変更する権利があります。 |
.
.
.
-- Variables for main program use
type ALL_DATATYPES_RECORD_TYPE IS
record
.
.
.
VARCHAR_VAR : sql_varchar_40;
end record;
.
.
.
-- The following if statements evaluate the contents of main variables
-- and then set indicators as appropriate.
.
.
.
if all_datatypes_record.varchar_var.l = 0 then
indicator_group(7) := -1; end if;
|
SQLでは、弁別子を使用する型やアクセス型は参照できません。SQLでは、整数(RANGEキーワード)型、浮動小数点(DIGITSキーワード)型、または固定小数点(DELTAキーワード)型は参照できません。
context_struc.sqlcontext_ver := 1; context_struc.sqlcontext_tid.sqlcontext_tid_type := 1 context_struc.sqlcontext_tid.sqlcontext_tid_len := 16; context_struc.sqlcontext_tid.sqlcontext_tid_value(1) := 0; context_struc.sqlcontext_tid.sqlcontext_tid_value(2) := 0; context_struc.sqlcontext_tid.sqlcontext_tid_value(3) := 0; context_struc.sqlcontext_tid.sqlcontext_tid_value(4) := 0; context_struc.sqlcontext_end := 0; |
次の例は、SQL文で参照可能なAda宣言を示しています。
-- Record with STANDARD, SYSTEM, and SQL package data types:
type ALL_DATATYPES_RECORD_TYPE IS
record
CHAR_VAR : string(1..10);
SMALLINT_VAR : short_integer;
INTEGER_VAR : integer;
REAL_VAR : system.F_float;
DOUBLE_PREC_VAR : system.G_float;
BIN_DATE_VAR : sql_date;
VARCHAR_VAR : sql_varchar_40;
end record;
ALL_DATATYPES_RECORD : all_datatypes_record_type;
-- Derived type (SQL ignores RANGE specification):
type my_int is new integer range 1..20000;
-- Record using derived type:
type p_type is
record
pnum : string(1..6);
pname : string(1..20);
color : string(1..6);
weight : my_int;
city : string(1..20);
end record;
p : p_type;
-- Indicator structure for handling null values:
type INDICATOR_GROUP_TYPE is array(1..7) of short_integer;
INDICATOR_GROUP : indicator_group_type := (0,0,0,0,0,0,0);
-- Indicator arrays:
IND2 : array (1..5) of short_integer;
subtype SUB_SHORT_INT is short_integer range -1..2000;
type MY_SUB_IND_TYPE is array(1..5) of SUB_SHORT_INT;
IND4 : array(1..5) of SUB_SHORT_INT;
ind5 : MY_SUB_IND_TYPE;
-- Character array:
CHAR1 : array(1..20) of character;
-- Character array referring to subtype:
subtype X is character;
type CHAR2 is array(1..20) of X;
P : CHAR2;
|
無効な宣言構文の例は、次のとおりです。各宣言の前にあるコメントは、宣言によって指定された変数や、宣言に依存する変数をSQL文で参照できない理由を示しています。
-- Enumerated type:
type ENUM_TYPE is (T1, T2, T3);
ENUM_TYPE_OBJ : ENUM_TYPE;
-- Integer type (RANGE allowed only in derived type or subtype):
type INTEGER_TYPE is range 1..20;
INTEGER_TYPE_OBJ : INTEGER_TYPE;
-- Type with DIGITS:
type FLOAT_TYPE is digits 10;
FLOAT_TYPE_OBJ : FLOAT_TYPE;
-- Access type:
type ACCESS_TYPE is access integer;
ACCESS_TYPE_OBJ : ACCESS_TYPE;
-- Discriminants in a record declaration:
type DISCR(X, Y, Z : integer := (X + 20)/2; W : natural) is
record
R1 : array(1..W) of character;
R2 : integer := X;
end record;
DISCR_OBJ : DISCR;
-- Variant records
type VAR_REC is
record
I : integer;
case I is
when 1 =>
X : integer;
when (3*j) =>
Y : integer;
when others
case J is
when 1 =>
Z1 : integer;
when 2 =>
Z2 : integer;
end case
end case
end record;
VAR_REC_OBJ : VAR_REC;
-- Multiple dimensioned array:
type MULDIM_ARR is array(1..20, 1..20) of integer;
MULDIM_ARR_OBJ : MULDIM_ARR;
-- Unconstrained array:
type UNC_ARRAY is array( integer range <>) of integer;
UNC_ARRAY_OBJ : UNC_ARRAY;
-- Unrecognized declaration of array (not SHORT_INT):
IND4 : array(1..5) of short_short_int;
|
表4-3は、各SQLデータ型についてサポートされるAda変数宣言の例を示しています。
| SQLの例 | Adaの例 |
|---|---|
| CHAR(10) | STR1 : SQL_STANDARD.CHAR(1..10);1 |
| VARCHAR(80) | STR2 : SQLVARCHAR_80;2 |
| LONG VARCHAR | STR3 : SQLVARCHAR_16383;2 |
| TINYINT(2) TINYINT |
サポートなし NUM1 : SHORT_SHORT_INTEGER; |
| SMALLINT(2) SMALLINT |
サポートなし NUM1 : SQL_STANDARD.SMALLINT;1 |
| INTEGER(2) INTEGER |
サポートなし NUM2 : SQL_STANDARD.INT;1 |
| BIGINT(2) BIGINT |
サポートなし サポートなし |
| FLOAT(6) FLOAT(25) |
NUM4 : SQL_STANDARD.REAL;1 NUM4 : SQL_STANDARD.DOUBLE_PRECISION;1 |
| REAL | NUM5 : SQL_STANDARD.REAL;1 |
| DOUBLE PRECISION | NUM6 : SQL_STANDARD.DOUBLE_PRECISION;1 |
| DATE | DATENUM1 : SQL_DATE; |
| DATE ANSI | DATENUM2 : SQL_DATE_ANSI; |
| DATE VMS | DATENUM3 : SQL_DATE_VMS; |
| TIME | DATENUM4 : SQL_TIME(0); |
| TIMESTAMP | DATENUM5 : SQL_TIMESTAMP(2); |
| INTERVAL DAY TO HOUR | DATENUM6 : SQL_INTERVAL (DAY TO HOUR);3 |
| LIST OF BYTE VARYING | STR4 : SQL_STANDARD.CHAR(1..8);4 |
オンライン・サンプル・プログラムsql_all_datatypes.sqladaには、変数を宣言してSQL文で使用する例が用意されています。また、このプログラムは、様々なSQLデータ定義文およびデータ操作文も示します。SQLをインストールした後、プログラムを出力、入力または検索することにより、様々なトピックに関するサンプル・コードを見つけることができます。
次の例は、サンプル・プログラムsql_all_datatypes.sqladaをプリコンパイル、リンクおよび実行するコマンドを示しています。