4D v14

4D SQLエンジンにアクセスする

ホーム

 
4D v14
4D SQLエンジンにアクセスする

4D SQLエンジンにアクセスする  


 

4DのビルトインSQLエンジンは3つの方法で呼び出すことができます:

  • QUERY BY SQLコマンドを使用する。SQLのSELECT文のWHERE句をquery引数に渡します。
    例:
 QUERY BY SQL([OFFICES];"SALES > 100")
  • 4Dに統合されたSQLコマンドを使用する (“SQL”テーマのSQL SET PARAMETERSQL EXECUTEなど) 。これらのコマンドはODBCデータソース、またはカレントデータベースの4D SQLエンジンに対して実行されます。
  • 4D標準のメソッドエディタを使用する。SQL文を直接4Dのメソッドエディタに記述できます。これを行うには、SQLクエリをBegin SQLEnd SQLタグの間に記述します。4Dのインタプリタは、これらのタグの間に記述されたコードを解析せず、コードはSQLエンジン (またはSQL LOGINコマンドで設定されている場合は他のエンジン) によって実行されます。

すべてのタイプの有効な4D表現式 (変数、フィールド、配列、式...) をSQL式のWHEREINTO句で参照できます。4D参照であることを示すために、以下のいずれかの記法を使用できます:

  • 参照を"<<"と">>"との間に記述する。
  • 参照の前にコロン":"を置く。

例:

 C_TEXT(vName)
 vName:=Request("Name:")
 SQL EXECUTE("SELECT age FROM PEOPLE WHERE name=<<vName>>")

または:

 C_TEXT(vName)
 vName:=Request("Name:")
 Begin SQL
    SELECT age FROM PEOPLE WHERE name= :vName
 End SQL

注: インタープロセス変数を使用する場合は、ブラケット [] が必要です (例えば<<[<>myvar]>>または:[<>myvar])。

コンパイルモードでは特定の条件下において、SQL文の中でローカル変数参照を使用できます:

  • Begin SQL / End SQLブロック内でローカル変数を使用できます。ただしEXECUTE IMMEDIATEコマンドは除きます;
  • 変数を (参照ではなく) 引数内で直接使用する場合、SQL EXECUTEコマンドでローカル変数を使用できます。
    例えば以下のコードはコンパイルモードで動作します:
     SQL EXECUTE("select * from t1 into :$myvar")

    以下のコードはコンパイルモードでエラーを生成します:
     C_TEXT(tRequest)
     tRequest:="select * from t1 into :$myvar"
     SQL EXECUTE(tRequest)

SELECT文でのデータ取得は、Begin SQL/End SQLタグの中のSELECTコマンドでINTO句を使用する方法と、 "SQL"ランゲージコマンドを使う方法、両方で可能です。

  • Begin SQL/End SQLタグを使用する場合、SQLクエリ内のINTO句で、有効な4D式 (フィールド、変数、配列) を参照して値を受け取ります:
 Begin SQL
    SELECT ename FROM emp INTO <<[Employees]Name>>
 End SQL
  • SQL EXECUTEコマンドでは、追加の引数も使用できます:
 SQL EXECUTE("SELECT ename FROM emp";[Employees]Name)

SQLからデータを受け取るこれら (Begin SQL/End SQLタグとSQLコマンド) 2つの方法の主な違いは、前者は一ステップですべての情報が4Dに返されるのに対し、後者はレコードを明示的にSQL LOAD RECORDでロードしなければならないことにあります。

例えばPEOPLEテーブルに100レコードあるとして:

  • 4Dの汎用SQLコマンドの場合:
 ARRAY INTEGER(aBirthYear;0)
 C_STRING(40;vName)
 vName:="Smith"
 $SQLStm:="SELECT Birth_Year FROM PEOPLE WHERE ename= <<vName>>"
 SQL EXECUTE($SQLStm;aBirthYear)
 While(Not(SQL End selection))
    SQL LOAD RECORD(10)
 End while

100レコードをすべて取り出すために10回ループします。一回ですべてのレコードをロードするには以下のようにします:

 ARRAY INTEGER(aBirthYear;0)
 C_STRING(40;vName)
 vName:="Smith"
 Begin SQL
    SELECT Birth_Year FROM PEOPLE WHERE ename= <<vName>> INTO <<aBirthYear>>
 End SQL

この場合、SELECT文の実行後、aBirthYear配列のサイズは100となり、各要素は100レコードから取り出された誕生年で埋められます。
配列ではなく (4Dフィールドなどの) カラムにデータを取得すると、4Dは必要なだけ自動でレコードを作成し、データを保存します。先の例題で、 PEOPLEテーブルに100レコードがあると仮定しました:

  • 4Dの汎用SQLコマンドの場合:
 C_STRING(40;vName)
 vName:="Smith"
 $SQLStm:="SELECT Birth_Year FROM PEOPLE WHERE ename= <<vName>>”
 SQL EXECUTE($SQLStm;[MYTABLE]Birth_Year)
 While(Not(SQL End selection))
    SQL LOAD RECORD(10)
 End while

100レコードを取得するために10回のループを行います。ループ毎に[MYTABLE]テーブルに10レコードが作成され、PEOPLEテーブルから取得したBirth_Yearが[MYTABLE]Birth_Yearフィールドに保存されます。

 C_STRING(40;vName)
 vName:="Smith"
 Begin SQL
    SELECT Birth_Year FROM PEOPLE WHERE ename= <<vName>> INTO <<[MYTABLE]Birth_Year>>
 End SQL

この場合、SELECT文の実行中、[MYTABLE]テーブルに100レコードが作成され、それぞれのBirth_YearフィールドにはPEOPLEテーブルのBirth_Yearカラムの対応するデータが格納されます。

4Dは、SELECTクエリの結果データをリストボックスに配置するために使用できる、特別な自動機能 (LISTBOXキーワード) を提供します。詳細はDesign Referenceマニュアルを参照してください。

最適化のために、クエリにはSQL関数よりも4D式を使用することをお勧めします。4D式はクエリ実行前に一度だけ評価されます。SQL関数はそれぞれのレコード毎に評価されます。

例えば以下の文で:

 SQL EXECUTE("SELECT FullName FROM PEOPLE WHERE FullName=<<vLastName+vFirstName>>")

vLastName+vFirstName式はクエリの実行前に一度だけ計算されます。以下の文では:

 SQL EXECUTE("SELECT FullName FROM PEOPLE WHERE FullName=CONCAT(<<vLastName>>,<<vFirstName>>)")

CONCAT(<<vLastName>>,<<vFirstName>>) 関数はテーブルのレコード毎に呼び出されます。言い換えればレコードごとに式が評価されます。

 
プロパティ 

プロダクト: 4D
テーマ: 4DでSQLを使用する

 
参照 

4d_language_reference

 
ARTICLE USAGE

SQLリファレンス ( 4D v11 SQL Release 4 )
SQLリファレンス ( 4D v14)
SQLリファレンス ( 4D v12.1)
SQLリファレンス ( 4D v13.4)
SQLリファレンス ( 4D v14 R2)
SQLリファレンス ( 4D v14 R3)
SQLリファレンス ( 4D v14 R4)