version 11
4D SQLエンジンにクエリを送信する
4DのビルトインSQLエンジンは三つの方法で呼び出すことができます:
・QUERY BY SQLコマンドを使用する。query引数として、SQLのSELECT文のWHERE節を渡します。
例題:
QUERY BY SQL([OFFICES];"SALES > 100")
・4Dに統合されたSQLコマンドを使用する (“SQL”テーマのSQL SET PARAMETER、SQL EXECUTE、etc.など) 。これらのコマンドはODBCデータソース、またはカレントデータベースの4D SQLエンジンで起動します。
・4D標準のメソッドエディタを使用する。SQL文を直接4Dのメソッドエディタに記述できます。これを行うには、SQLクエリをBegin SQLとEnd SQLタグの間に記述します。4Dのインタプリタは、これらのタグの間に記述されたコードを解析せず、コードはSQLエンジンによって実行されます (SQL LOGINコマンドで設定されている場合は、他のエンジンによって) 。
4DとSQLエンジン間でデータを渡す
4D表現式の参照
すべての有効なタイプの4D表現式 (変数、フィールド、配列、式...) をSQL式で参照できます。4D参照であることを示すために、以下のいずれかの記法を使用できます:
・参照を “<<”と“>>” との間に記述する。
・参照の前にコロン “:” を置く。
例題:
C_STRING(80;vName)
vName:=Request("Name:")
SQL EXECUTE("SELECT age FROM PEOPLE WHERE name=<<vName>>")
または
C_STRING(80;vName)
vName:=Request("Name:")
Begin SQL
SELECT age FROM PEOPLE WHERE name= :vName
End SQL
Note: インタープロセス変数を使用する場合は、ブラケット [] が必要です (例えば<<[<>myvar]>>または:[<>myvar])。
SQLリクエストから4Dにデータを受け取る
SELECT文でのデータ取得は、Begin SQL/End SQLタグの中でSELECTコマンドのINTO節を使用する方法と、 "SQL" (ODBC) ランゲージコマンドを使う両方で可能です。
・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コマンド) 二つの方法の主な違いは、前者は一ステップですべての情報が4Dに返されるのに対し、後者はレコードを明示的にSQL LOAD RECORDでロードしなければならないことにあります。
例えば、PEOPLEテーブルに100レコードあるとして:
・4Dの汎用SQLコマンドの場合:
配列 整数(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回ループします。一回ですべてのレコードをロードするには以下のようにします:
SQL LOAD RECORD(SQL All Records)
・Begin SQL/End SQLタグの場合:
配列 整数(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は必要なだけ自動でレコードを作成し、データを保存します。先の例題で、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フィールドに保存されます。
・Begin Begin SQL/End SQLタグの場合:
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に表示する特別な機能を提供します。
クエリの最適化
最適化のために、クエリには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>>)関数はテーブルのレコード毎に呼び出されます。言い換えればレコードごとに式が評価されます。