ヘッダーをスキップ
Oracle Rdb SQLリファレンス・マニュアル
リリース7.2
E06178-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

4.4 プリコンパイラでサポートされているホスト言語変数宣言

SQLプリコンパイラでは、有効なホスト言語変数宣言のサブセットのみが認識されます。埋込みSQL文で認識されない変数宣言を参照すると、この参照が行われたときに致命的エラーが発生します。

SQLプリコンパイラでサポートされているOracle Rdbデータベースおよび様々なホスト言語では、必ずしも同じデータ型セットがサポートされるとはかぎりません。プリコンパイラでは、SQLデータ型に相当するホスト言語変数宣言に加えて、他のホスト言語変数宣言のサブセットが認識されます。

次の項では、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 文字パラメータの長さの指定

文字変数の長さを正しく指定するには、次のガイドラインを使用します。

次のキャラクタ・セットを使用して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];
   .
   .
   .

4.4.2 サポートされているAda変数宣言

ホスト言語変数は、直接宣言したり、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プリコンパイラがサポートしている変数宣言構文を示しています。

次の例は、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変数宣言の例を示しています。

表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


1ソース・ファイルでは、SQL$STANDARD.ADAパッケージを明示的に使用してこれらの型を指定する必要があります。
2$SQL_VARCHARデータ型は、処理時に生成されるパッケージの一部として定義されます。
3表4-2は、サポートされているすべてのINTERVALデータ型を示しています。
4この例は、8バイトの文字列を使用して、セグメント化された文字列識別子、リストの先頭要素のポインタを取得する方法を示しています。このリストの個別要素の値を取得するには、CHARデータ型またはVARCHARデータ型のホスト言語変数を使用します。

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

次の例は、サンプル・プログラムsql_all_datatypes.sqladaをプリコンパイル、リンクおよび実行するコマンドを示しています。