4D には SQL カーネルが統合されています。さらに 4D には SQL サーバー機能が含まれていて、他の4Dアプリケーションや (4D ODBC Driver 経由で) サードパーティアプリケーションからクエリを実行できます。
4DのSQL関連ドキュメントは大きく二つあります:
- 4D SQL リファレンスガイド (SQLリファレンス): このマニュアルでは4DのSQLカーネルにアクセスするための様々な方法、SQLサーバー設定、およびSQLクエリで使用できるコマンドやキーワード (例えば SELECT や UPDATE) について説明しています。4Dに実装されたSQLランゲージについて知りたい場合はこのマニュアルを参照してください。
- 4D ランゲージリファレンスの "SQL" テーマ (SQL): このテーマには、4DランゲージからSQLを利用するためのハイレベルコマンドがまとめられています:
- SQL サーバーの制御: START SQL SERVER と STOP SQL SERVER
- 統合 SQL カーネルへの直接アクセス: SET FIELD VALUE NULL, Is field value Null, QUERY BY SQL
- 外部または内部データソース (SQL パススルー) への接続管理: GET DATA SOURCE LIST, Get current data source, SQL LOGIN, SQL LOGOUT
- 直接SQL接続またはODBCを経由した接続のフレームワークにおけるデータ処理ハイレベルコマンド: Begin SQL, End SQL, SQL CANCEL LOAD, SQL LOAD RECORD, SQL EXECUTE, SQL End selection, SQL SET OPTION, SQL SET PARAMETER, SQL GET LAST ERROR, SQL GET OPTION.
4Dの組み込みSQLコマンドは、接頭辞"SQL" で始まります。そして、以下の原則が実装されます:
- 特に断らない限り、これらのコマンドを4Dの内部SQLカーネル、外部へのダイレクトまたはODBC経由の接続で使用できます。SQL LOGINコマンドで接続方法を指定できます。
- 接続のスコープはプロセスです。同時に複数の接続を実行したい場合、新たに開始したプロセスでSQL LOGINを実行します。
- ON ERR CALLコマンドを使用して、ハイレベルSQLコマンドを実行している間に発生したODBCエラーを捕らえることができます。追加情報を得るにはSQL GET LAST ERRORコマンドを使用します。
ODBC (Open DataBase Connectivity) 標準は、標準化された機能のライブラリを定義します。これらの機能により4Dのようなアプリケーションは、SQLランゲージでODBC互換のデータ管理シ ステム(データベース、スプレッドシート、他の4Dのアプリケーションなど) へアクセスできます。
注: 4DではIMPORT ODBCやEXPORT ODBCコマンドを使用して、あるいはデザインモードで手動により、ODBCソースからデータを読み込んだり、ODBCソースへデータを書き出したりすることが可能です。詳細については、4D Design Referenceマニュアルを参照してください。
注: 4DのハイレベルSQLコマンドを使用して、ODBCデータソースと通信する単純な4Dアプリケーションを実装できます。もしアプリケーションでODBC標準の広範なサポートが必要である場合、4DのローレベルODBCプラグインである、4D ODBC Proをお使いください。
以下は4Dが自動的に設定する4DのタイプとSQLデータタイプの対応リストです:
4Dのタイプ | SQLのタイプ |
C_STRING | SQL_C_CHAR |
C_TEXT | SQL_C_CHAR |
C_REAL | SQL_C_DOUBLE |
C_DATE | SQL_C_TYPE_DATE |
C_TIME | SQL_C_TYPE_TIME |
C_BOOLEAN | SQL_C_BIT |
C_INTEGER | SQL_C_SHORT |
C_LONGINT | SQL_C_SLONG |
C_BLOB | SQL_C_BINARY |
C_PICTURE | SQL_C_BINARY |
C_GRAPH | SQL_C_BINARY |
SQLリクエストに4D式 (変数、配列、フィールド、ポインタ、有効な式) を挿入するには2通りの方法があります。一つは直接割り当てる方法。もう一つはSQL SET PARAMTERで引数を設定する方法です。
直接の割り当ては2つの方法で実行できます:
- リクエストのテキスト中で、4Dオブジェクト名を<< と >>文字の間に挿入する
- 参照をコロンの後に記述する
SQL EXECUTE("INSERT INTO emp (empnum,ename) VALUES (<<vEmpnum>>,<<vEname>>)")
SQL EXECUTE("SELECT age FROM People WHERE name= :vName")
Note: コンパイルモードでは、($で始まる) ローカル変数への参照を使用することはできません。
この例では、リクエスト実行時に引数が4DのvEmpnum、vEnameおよびvNametheの現在値に置き換えられます。このソリューションは4Dフィールドと配列でも動作します。
この簡単に使用できるシンタックスには、SQL標準に対応していない、また出力引数の使用を許可しないといった欠点もあります。これを修正するには、SQL SET PARAMETERコマンドを使用します。このコマンドを使用して使用モード (入力と出力) とともに、リクエストに各4Dオブジェクトを統合できます。作り出されたシンタックスは標準のものです。詳細については、SQL SET PARAMETERコマンドの説明を参照してください。
1. この例題では4D配列を直接関連付けてSQLクエリを実行します:
ARRAY TEXT(MyTextArray;10)
ARRAY LONGINT(MyLongintArray;10)
For(vCounter;1;Size of array(MyTextArray))
MyTextArray{vCounter}:="Text"+String(vCounter)
MyLongintArray{vCounter}:=vCounter
End for
SQL LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES (<<MyTextArray>>, <<MyLongintArray>>)"
SQL EXECUTE(SQLStmt)
2. この例題では4Dフィールドを直接関連付けて、SQLクエリを実行します:
ALL RECORDS([Table_2])
SQL LOGIN("mysql";"root";"")
SQLStmt:="insert into app_testTable (alpha_field, longint_field) VALUES (<<[Table_2]Field1>"+">,<<[Table_2]Field2>>)"
SQL EXECUTE(SQLStmt)
3. この例題では逆参照されたポインタを使用して直接変数を渡して、SQLクエリを実行します:
C_LONGINT($vLong)
C_POINTER($vPointer)
$vLong:=1
$vPointer:=->$vLong
SQL LOGIN("mysql";"root";"")
SQLStmt:="SELECT Col1 FROM TEST WHERE Col1=:$vPointer"
SQL EXECUTE(SQLStmt)
コンパイルモードでは特定の条件下において、SQL文の中でローカル変数参照を使用できます:
4Dランゲージ中でSQLクエリの値を受け取る方法は2つあります:
- SQL EXECUTE コマンドの追加の引数を使用する (推奨)
- SQLクエリのINTO節を使用する (特別な場合のために予約されたソリューション)
SQLクエリーの結果を直接配列タイプのリストボックスに表示することができます。これによりSQLクエリーの結果を素早く見る方法が提供されま す。SELECTタイプのクエリーのみを使用できます。このメカニズムは外部SQLデータベースには使用できません。
この機能は以下の原則に基づいて動作します:
- クエリーの結果を受け取るリストボックスを作成します。リストボックスのデータソースは配列に設定しなければなりません。
- SELECTタイプのSQLクエリーを実行し、結果をリストボックスに割り当てた変数に受け取ります。Begin SQL/End SQL キーワードを使用できます (4Dランゲージリファレンス参照)。
- ユーザーはリストボックス列をソートしたり、更新したりできます。
- SELECTクエリーを実行するたびに、リストボックス列はリセットされます (複数のSELECTクエリーを実行して、リストボックスに行を追加することはできません)。
- SQL クエリーの結果受け取る列数と同じ数の列をリストボックスに用意することを推奨します。[#cmd id="18499"/]クエリーにより返される列数よりもリストボックスの列数が少ない場合、自動で列が追加されます。[#cmd id="18499"/]クエリーの結果よりも多い列数がある場合、不必要な列は自動で隠されます。
注: 自動で追加された列は、 配列型の [#title id="728" anchor="202551"/] にバインドされます。これらのダイナミック配列はフォームが閉じられるまで存在します。またダイナミック変数は各ヘッダー用にも作成されます。LISTBOX GET ARRAYSコマンドが呼び出されると、arrColVars引数にはダイナミック配列へのポインターが、arrHeaderVars引数にはダイナミックヘッダー変数へのポインターが返されます。例えば5つの列が追加されると、5番目の列の配列名はsql_column5でヘッダー名はsql_header5となります。 - インタープリターモードでは、SQLクエリーにより返されたデータに基づき、自動でリストボックスの既存の配列が型変更される場合があります。
例
PEOPLEテーブルのすべてのフィールドのデータを取得し、vlistboxという変数名のリストボックスに結果を表示します。これを行うためのメソッドは以下の通りです:
Begin SQL
SELECT * FROM PEOPLE INTO <<vlistbox>>
End SQL