スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

7.2.1 記述規則

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

<この項の構成>
(1) 名標の付け方の規則
(2) 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文中での注釈及びSQL最適化指定については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。
  11. \記号での行の継続は使用できません。
  12. -Eオプションを使用すると,Cコンパイラのプリプロセサ宣言文が有効となるため,#ifdefでのSQL文の切り替えができ,また,埋込みSQL宣言節の定数をマクロ定数で記述できます。ただし,次の制限があります。
    • SQL先頭子からSQL終了子までの間に,プリプロセサ宣言文を記述できません。
    • SQL先頭子とSQL終了子のカラム位置が変わるマクロは使用できません。
    • SQL先頭子,及びSQL終了子のマクロ定義はできません。
  13. -Eオプションを使用すると,C言語の文法に従って宣言された,SQLのデータ型に対応した変数であれば,埋込みSQL宣言節で埋込み変数を宣言しなくても,埋込み変数を使用できます。同じ名称の変数がある場合は,C言語の文法に従って,それぞれの変数の有効範囲を判定します。インクルードヘッダの中で宣言した変数も使用できます。ただし,次の制限があります。
    • 変数名は,先頭から63文字までが区別されます。64文字目以降は区別されません。なお,ユニバーサル文字名(\uxxxxと\Uxxxxxxxx)は1文字としてカウントされます。
    • ネストした構造体は使用できません。
    • 宣言文の中で,添字に式を使用している埋込み変数は使用できません。
    • const型の埋込み変数は,入力用の変数としてだけ使用できます。
    • 変数名,関数名などのC言語の識別子として,大文字,小文字に関係なく「varchar」は使用できません。
  14. -Eオプションを使用すると,複数個の埋込み変数をメンバとして持つ構造体を,埋込み変数として宣言できます。すべてのメンバは,SQLのデータ型に対応した形式でなければなりません。構造体の中に,構造体及び共用体を含めることはできません。ただし,可変長文字列型,及びBINARY型に対応する構造体は使用できます。
  15. -Eオプションを使用すると,ポインタを埋込み変数として宣言できます。宣言の形式はC言語の文法に従います。SQL文中で使用する場合は,埋込み変数名の前にアスタリスクを付けないで,通常の埋込み変数と同じ形式で記述します。
  16. -Eオプションを使用すると,構造体のメンバを埋込み変数として明示的に指定する場合は,構造体名で修飾して":構造体.メンバ名"と記述します。構造体へのポインタを使用する場合は,ポインタで修飾して":ポインタ名->メンバ名"と記述します。
  17. Windows版の場合に-Eオプションを指定したときは,次の制限があります。
    • typedefで,同じtypedef名を二回定義しても構文エラーになりませんが,定義内容が同じかどうかのチェックはされません。
    • 匿名構造体のメンバは,埋込み変数として使用できません。
    • 記憶クラス,及びデータ型なしで記述した宣言子は,埋込み変数として使用できません。
  18. -Eオプション指定時には,COPY文は使用できません。
  19. 可変長配列は,埋込み変数として使用できません。
  20. -Eオプション指定時には,2文字表記「<:」,「<%」など,及び3文字表記「??(」,「??=」などの文字は使用できません。また,-Eオプションを指定しない場合でも,SQL文と埋込みSQL宣言節では使用できません。使用すると,通常の文字として扱われます。
  21. -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オプション指定時には,ビットフィールドは任意の整数型として宣言できます。ただし,ビットフィールドは埋込み変数の宣言には使用できません。