ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com

ホーム

 
4D v20 R7
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>><br/>
     End SQL
  • SQL EXECUTEコマンドでは、追加の引数も使用できます:
     SQL EXECUTE("SELECT ename FROM emp";[Employees]Name)

: 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回ループします。一回ですべてのレコードをロードするには以下のようにします:    
  • Begin SQL/End SQLタグの場合:
     ARRAY INTEGER(aBirthYear;0)
     C_TEXT(vName)
     vName:="Smith"
     Begin SQL
        SELECT Birth_Year FROM PERSONS WHERE ename= <<vName>>INTO <<aBirthYear>>
     End SQL

この場合、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フィールドに保存されます。
  • Begin SQL/End SQLタグの場合:
     C_TEXT(vName)
     SELECT Birth_Year FROM PERSONS WHERE ename=<<vName>>INTO<<[MYTABLE]Birth_Year>><br/>
    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_language_reference

 
プロパティ 

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

 
ページの目次 
 
履歴 

 
ARTICLE USAGE

SQLリファレンス ( 4D v20 R7)