4DのビルトインSQLエンジンは3つの方法で呼び出すことができます:
- 4D標準のメソッドエディタを使用する。SQL文を直接4Dのメソッドエディタに記述できます。これを行うには、SQLクエリをBegin SQLとEnd SQLタグの間に記述します。4Dのインタプリタは、これらのタグの間に記述されたコードを解析せず、コードはSQLエンジン (またはSQL LOGIN コマンドで設定されている場合は他のエンジン) によって実行されます。
すべてのタイプの有効な4D表現式 (変数、フィールド、配列、式...) をSQL式のWHEREとINTO句で参照できます。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文の中でローカル変数参照を使用できます:
SELECT文でのデータ取得は、Begin SQL/End SQLタグの中のSELECTコマンドでINTO句を使用する方法と、 "SQL"ランゲージコマンドを使う方法、両方で可能です。
注: 4D v17 R5 以降、SQL クエリ内においてオブジェクトフィールドがサポートされるようになりました。
SQLからデータを受け取るこれら (Begin SQL/End SQLタグとSQLコマンド) 2つの方法の主な違いは、前者は一ステップですべての情報が4Dに返されるのに対し、後者はレコードを明示的にSQL LOAD RECORDでロードしなければならないことにあります。
例えばPEOPLEテーブルに100レコードあるとして:
- 4Dの汎用SQLコマンドの場合:
ARRAY INTEGER(aBirthYear;0)
C_TEXT(vName)
vName:="Smith"
$SQLStm:="SELECT Birth_Year FROM PERSONS WHERE ename= <<vName>>"
SQL EXECUTE($SQLStm;aBirthYear)
While(Not(SQL End selection))
SQL LOAD RECORD(10)
End while
100レコードをすべて取り出すために10回ループします。一回ですべてのレコードをロードするには以下のようにします:
この場合、SELECT文の実行後、aBirthYear配列のサイズは100となり、各要素は100レコードから取り出された誕生年で埋められます。
配列ではなく (4Dフィールドなどの) カラムにデータを取得すると、4Dは必要なだけ自動でレコードを作成し、データを保存します。先の例題で、 PEOPLEテーブルに100レコードがあると仮定しました:
- 4Dの汎用SQLコマンドの場合:
C_TEXT(vName)
vName:="Smith"
$SQLStm:="SELECT Birth_Year FROM PERSONS 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フィールドに保存されます。
この場合、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>>) 関数はテーブルのレコード毎に呼び出されます。言い換えればレコードごとに式が評価されます。