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

4D - Documentation   Fran溝is   English   German   日本語   4D SQL Reference目次   4D SQL Referenceインデックス   Back   Previous   Next

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 SQLEnd 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>>)関数はテーブルのレコード毎に呼び出されます。言い換えればレコードごとに式が評価されます。


4D - Documentation   Fran溝is   English   German   日本語   4D SQL Reference目次   4D SQL Referenceインデックス   Back   Previous   Next