Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


7.2.1 記述規則

UAPを作成するとき,SQLの文法の規則以外に,名標の付け方やSQLの記述についての規則があります。

〈この項の構成〉

(1) 名標の付け方の規則

名標を付ける場合,基本的にC言語の規則に従います。

C言語の規則以外に,使用できない名標を次に示します。

なお,SQL中で使用する埋込み変数,標識変数,及び分岐先ラベルの名称の付け方は,名標の付け方,及びC言語の規則に従います。

(2) SQLの記述規則

  1. SQLは,一つのSQL文ごとにSQL先頭子(EXEC SQL)とSQL終了子(;)とで囲みます。

    <正しい指定例>

      EXEC SQL  SQL文  ;
  2. 埋込みSQL文,又はその一部にC言語のマクロ機能を使用できません。

    <誤った指定例>

      #define X USER.MEMBER
      
      EXEC SQL
        SELECT NAME INTO :MANNAME FROM X;

    注  部分が誤りです。

  3. SQLの予約語は,大文字でも小文字でも使用できます。

    <指定例1>

      EXEC SQL
        SELECT MEM INTO :NAME FROM TABLE;

    <指定例2>

      exec sql
        select MEM into :NAME from TABLE;

    <指定例3>

      exec SQL
        SELECT MEM Into :NAME From TABLE;
  4. SQL先頭子,埋込みSQL開始宣言,及び埋込みSQL終了宣言は,各1行で記述します。また,各々を構成する字句を区切るため,半角空白文字を挿入します。

    なお,改行文字の次の文字から次の改行文字までの文字列が1行です。ただし,プリプロセスするUAPのソースプログラムは,1行の長さが32000文字を超える記述ができないので,1行の長さを32000文字以内にしてください。

    <正しい指定例>

      EXEC SQL
        BEGIN DECLARE SECTION;
          :
      
      EXEC SQL
        END DECLARE SECTION;
      
      EXEC SQL
        SELECT  ...    ;

    <誤った指定例>

      EXEC SQL
        BEGIN  
        DECLARE SECTION;
          :
      
      EXEC SQL
        END  
        DECLARE SECTION;
      
      EXEC \
        SQL
        SELECT ...    ;

    注  部分が誤りです。

  5. 埋込みSQL宣言節の定義は,埋込み変数,又は標識変数を使用するSQLよりも前に宣言します。

    <指定例>

      EXEC SQL
        BEGIN DECLARE SECTION;
      short URIAGE;
      EXEC SQL
        END DECLARE SECTION;
           :
      
      EXEC SQL
        SELECT KINGAKU INTO :URIAGE
          FROM TABLE;
  6. 埋込み変数,及び標識変数を指定する場合,次の規則に従います。

    • 宣言文は複数行にわたって記述できます。また,同じ行に二つ以上の定義文を記述することもできます。

    <指定例>

      short URIAGE,
         SURYO;
      short URIAGE;     short SURYO;
    • 埋込みSQL宣言節内で記述できる項目を次の表に示します。

      表7‒1 埋込みSQL宣言節内で記述できる項目

      記述する項目

      埋込み宣言節内での記述

      注釈

      C言語の命令文

      ×

      C言語の制御文

      ×

      SQL文

      ×

      埋込み変数宣言

      標識変数宣言

    (凡例)

    ○:記述できます。

    ×:記述できません。

    • 一つのソースファイル内では,同一名称の埋込み変数,及び標識変数を二つ以上宣言できません。

    • 一つの宣言文で複数の埋込み変数,又は標識変数を宣言できます。

    <指定例>

      short URIAGE, SURYO ;     埋込み変数の宣言
      short XURIAGE, XSURYO ;   標識変数の宣言
  7. 関数内で宣言した埋込み変数はローカル変数になり,関数外で宣言した埋込み変数はグローバル変数になります。

  8. 関数ブロック内でC言語の命令文を記述できる箇所には,埋込みSQL文も記述できますが,ほかのSQL文,及びC言語で記述した文と同じ行には記述できません。

    なお,ラベルはSQL先頭子の前に付けることができます。

    SQL文を記述できる箇所を次の表に示します。

    表7‒2 SQL文を記述できる箇所

    同一行内の記述箇所

    SQL文の記述

    C言語と命令文

    ×

    ×

    ×

    C言語制御文

    ×

    ×

    ×

    ラベル

    ×

    注釈

    ×

    SQL文

    ×

    ×

    ×

    (凡例)

    ○:記述できます。

    ×:記述できません。

    注※

    SQL先頭子で始まり,SQL終了子で終わることを前提にします。

  9. VisualC++コンパイラでMFC(MicrosoftFoundationClass)用ヘッダファイル(AFXxxxxx.H)をHiRDBのUAPソースにインクルードする場合,次のSQL文でMFC用ヘッダファイルより後にHiRDBのヘッダファイルをインクルードしてください。HiRDBが提供するヘッダファイルを,このSQL文を記述した箇所でインクルードします。

    EXEC SQL INCLUDE HIRDB_HEADERS ;
    • INCLUDE HIRDB_HEADERSは,ポストソースの先頭で自動的にインクルードしていたHiRDBのヘッダファイルを,指定した箇所でインクルードするものです。

    • INCLUDE HIRDB_HEADERSは,C言語,及びC++言語でだけ使用できます。ほかの言語では使用できません。

    • INCLUDE HIRDB_HEADERSは,UAP中で一回だけ使用できます。

    • INCLUDE HIRDB_HEADERSを使用しない場合,ポストソースの先頭にHiRDBのヘッダファイルがインクルードされます。

    VisualC++が提供しているMFC用のヘッダファイルには,インクルードする順番に順序関係があり,WINDOWS.Hヘッダファイル(HiRDBが使用しているヘッダファイル)が先にインクルードされているとエラーになることがあります。この場合,INCLUDE HIRDB_HEADERSを使用してください。

    HiRDBは,次のVisualC++のヘッダファイルを使用しています。

    • WINDOWS.H

    • STRING.H

    INCLUDE HIRDB_HEADERSの使用例を次に示します。

    #include <afx.h>
    EXEC SQL INCLUDE HIRDB_HEADERS ;
  10. 注釈の規則を次に示します。

    • SQL先頭子からSQL終了子までの間に記述した囲み注釈(/*〜*/)及び単純注釈(-- 〜 改行)はSQLプリプロセサが削除します。ただし,SQL最適化指定(/*>>〜<<*/)は削除しないで,SQL文として扱います。また,引用符(")やアポストロフィ(')で囲まれた部分にある「/*〜*/」及び「--〜改行」は削除しません。

    • プリプロセスオプション-Xs又は/Xsを指定した場合にだけ,SQL先頭子からSQL終了子までの間に単純注釈を記述できます。

    • 単純注釈とSQL終了子を同じ行に記述することはできません。

    <単純注釈の正しい指定例>

    EXEC SQL -- 注釈1
        CALL PROC1(0) -- 注釈2
    ;

    <単純注釈の誤った指定例1>

    EXEC SQL CALL PROC1(0) -- 注釈1 ;

    この場合,単純注釈の中にセミコロン(;)があるため,セミコロンがSQL終了子としてみなされません。

    <単純注釈の誤った指定例2>

    EXEC SQL CALL PROC1(0) ; -- 注釈1

    この場合,「-- 〜 改行」がSQL先頭子からSQL終了子(;)の範囲外にあるため,「-- 〜 改行」が注釈としてみなされません。

    SQL文中での囲み注釈,単純注釈,及びSQL最適化指定については,マニュアル「HiRDB SQLリファレンス」を参照してください。

  11. \記号での行の継続は使用できません。

  12. -E又は/Eオプションを使用すると,Cコンパイラのプリプロセサ宣言文が有効となるため,#ifdefでのSQL文の切り替えができ,また,埋込みSQL宣言節の定数をマクロ定数で記述できます。ただし,次の制限があります。

    • SQL先頭子からSQL終了子までの間に,プリプロセサ宣言文を記述できません。

    • SQL先頭子とSQL終了子のカラム位置が変わるマクロは使用できません。

    • SQL先頭子,及びSQL終了子のマクロ定義はできません。

  13. -E又は/Eオプションを使用すると,C言語の文法に従って宣言された,SQLのデータ型に対応した変数であれば,埋込みSQL宣言節で埋込み変数を宣言しなくても,埋込み変数を使用できます。同じ名称の変数がある場合は,C言語の文法に従って,それぞれの変数の有効範囲を判定します。ただし,次の制限があります。

    • 変数名は,先頭から63文字までが区別されます。64文字目以降は区別されません。なお,ユニバーサル文字名(\uxxxxと\Uxxxxxxxx)は1文字としてカウントされます。

    • ネストした構造体は使用できません。

    • 宣言文の中で,添字に式を使用している埋込み変数は使用できません。

    • const型の埋込み変数は,入力用の変数としてだけ使用できます。

    • 変数名,関数名などのC言語の識別子として,大文字,小文字に関係なく「varchar」は使用できません。

  14. -E又は/Eオプションを使用すると,複数個の埋込み変数をメンバとして持つ構造体を,埋込み変数として宣言できます。すべてのメンバは,SQLのデータ型に対応した形式でなければなりません。構造体の中に,構造体及び共用体を含めることはできません。ただし,可変長文字列型,及びBINARY型に対応する構造体は使用できます。

  15. -E又は/Eオプションを使用すると,ポインタを埋込み変数として宣言できます。宣言の形式はC言語の文法に従います。SQL文中で使用する場合は,埋込み変数名の前にアスタリスクを付けないで,通常の埋込み変数と同じ形式で記述します。

  16. -E又は/Eオプションを使用すると,構造体のメンバを埋込み変数として明示的に指定する場合は,構造体名で修飾して":構造体.メンバ名"と記述します。構造体へのポインタを使用する場合は,ポインタで修飾して":ポインタ名->メンバ名"と記述します。

  17. Windows版の場合に/Eオプションを指定したときは,次の制限があります。

    • typedefで,同じtypedef名を二回定義しても構文エラーになりませんが,定義内容が同じかどうかのチェックはされません。

    • 匿名構造体のメンバは,埋込み変数として使用できません。

    • 記憶クラス,及びデータ型なしで記述した宣言子は,埋込み変数として使用できません。

  18. -E又は/Eオプション指定時にも,SQLのCOPY文を使用できます。COPY文を使用できる条件については,表「プリプロセスオプション(UNIX環境のC言語の場合)」又は表「プリプロセスオプション(Windows環境のC言語の場合)」を参照してください。

  19. 可変長配列は,埋込み変数として使用できません。

  20. -E又は/Eオプション指定時には,2文字表記「<:」,「<%」など,及び3文字表記「??(」,「??=」などの文字は使用できません。また,-E又は/Eオプションを指定しない場合でも,SQL文と埋込みSQL宣言節では使用できません。使用すると,通常の文字として扱われます。

  21. -E又は/Eオプション指定時には,次に示すCの標準規格(C99)に規定されていない予約語を使用できます。

    用途

    処理

    環境※1

    予約語

    型修飾子,又は型指定子※2

    構文解析で型修飾子,又は型指定子として扱われる。

    Windows

    __int8,__int16,__int32,__int64,_int8,_int16,_int32,_int64

    UNIX

    __volatile__,__builtin_va_list,__complex__,__signed__

    その他

    構文解析で意味のない語句として扱うため無視される。

    Windows

    __based,__cdecl,__export,__far,__fastcall,__forceinline,__inline,__near,__pascal,__ptr32,__ptr64,__stdcall,__unaligned,__w64,_based,_cdecl,_export,_far,_fastcall,_forceinline,_inline,_near,_pascal,_stdcall__declspec,__pragma,_declspec__try,__except,__finally__asm,_asm

    UNIX

    __const,__const__,__extension__,__inline,__inline__,__restrict,__attribute__,__asm__

    注※1

    Windows環境の予約語は,Visual C++で使用されるものです。2文字の下線(__)で始まる予約語は,VisualC++6.0以降で定義されているものです。下位バージョンのVisual C++で作成したソースのために,1文字の下線(_)で始まる場合も含めます。

    UNIX環境の予約語は,gccで使用されるものです。

    注※2

    型修飾子,又は型指定子として扱う予約語は,埋込み変数の宣言には使用できません。

  22. -E又は/Eオプション指定時には,ビットフィールドは任意の整数型として宣言できます。ただし,ビットフィールドは埋込み変数の宣言には使用できません。

  23. ソースにヘッダファイルを引き込む方法として,#includeとSQLのCOPY文があります。それぞれヘッダファイル中に記述できる項目を次に示します。

    項番

    記述項目

    ヘッダファイルを引き込む方法

    #include

    COPY文

    1

    SQL文

    COPY

    ×

    ×

    2

    COPY以外

    ×

    3

    埋込み変数宣言

    「SQL TYPE IS」で始まる

    ×

    4

    「VARCHAR」で始まる

    ×

    5

    「CHARACTER SET」を含む

    ×

    6

    C言語による変数宣言

    7

    標識変数宣言

    (凡例)

    ○:記述できます。

    ×:記述できません。

    △:-E3又は/E3オプション指定時にだけ記述できます。

    注※

    SQLプリプロセサが変換しなくてもCコンパイラが構文解析できる変数宣言のことです。

    なお,項番3〜5の埋込み変数宣言はSQLプリプロセサが変換しないとCコンパイラが構文解析できません。ただし,繰返し列用の埋込み変数宣言に使用するPD_MV_SINTなどはC言語のマクロとして定義しているため,繰返し列用の埋込み変数宣言はそのままでCコンパイラが構文解析できます。したがって,繰返し列用の埋込み変数宣言はC言語による変数宣言になります。