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

4D - Documentation   French   English   German   日本語   4D SQL Referenceコマンドテーマリスト   4D SQL Referenceインデックス   戻る   前   次

version 11


4D SQLエンジンにクエリを送信する


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

QUERY BY SQLコマンドを使用する。query引数として、SQLのSELECT文のWHERE句を渡します。

例題:

   QUERY BY SQL([OFFICES];"SALES > 100")

・4Dに統合されたSQLコマンドを使用する (“SQL”テーマのSQL SET PARAMETERSQL 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コマンドの場合:

   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回ループします。一回ですべてのレコードをロードするには以下のようにします:

   SQL LOAD RECORD(SQL All Records) 

Begin SQL/End SQLタグの場合:

   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は必要なだけ自動でレコードを作成し、データを保存します。先の例題で、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   French   English   German   日本語   4D SQL Referenceコマンドテーマリスト   4D SQL Referenceインデックス   戻る   前   次