Tips

SQLコマンドのキーワード"INFILE"

日付2009/01/01
ID09-009
バージョン11
プラットフォームWin & Mac

4D v11 SQL Release 3 (11.3)では、利用できるSQLコマンドのキーワードに"INFILE"が追加されました。INFILEキーワードは、外部ファイルの内容を使用して新しいレコードの値を定義するために使用されるものです。大事なのは、作られるレコードの数、つまりそれがひとつのレコードであるということです。INFILEは、外部ドキュメントを元に複数のレコードを作成する場合は想定しておらず、実際そのような操作をサポートしていません。主な用途は、テキストまたはBLOBフィールドの新規レコードデータを外部ファイルから取り込むためです。画像ファイルであれば、いったん、BLOBとして保存しなければなりません。VALUES句に複数のINFILEキーワードを使用することはできますが、フィールド毎にそのようにする必要があります。たとえば下記のような構文を記述します。

INSERT INTO {sql_name | sql_string}
[(column_reference, ..., column_reference)]
[VALUES({[INFILE]arithmetic_expression |NULL}, ..., {[INFILE]arithmetic_expression |NULL};)
|subquery]

INFILEと併用できるのは、VARCHARタイプの式に限られます。INFILEキーワードに続くarithmetic_expressionは、ファイルパス名として評価され、ファイルが存在する場合、その内容が対応する列にINSERTされます。INFILEから値を受け取ることができるのは、テキストあるいはBLOBタイプのフィールドだけです。ファイルの内容は直接伝送され、変換は行なわれません。

クエリがリモートクライアントで発行される場合であっても、INFILEで参照するファイルは、SQLエンジンが動作しているマシン上に存在しなければなりません。したがって渡されるパス名は、そのマシンのオペレーションシステムのシンタックスで表記されている必要があります。相対あるいは絶対パスが使用できます。下記の例題の場合、上はMac OS Xの絶対パス、下はWindowsの絶対パスを使用しています。コードの内容は、ファイル"myfile"の中身全体をテキストまたはBLOBの"theColumn"に取り込むというものです。

Begin SQL
  INSERT INTO theTable ( ID, theColumn )
  VALUES (1, INFILE "myHD:myFolder:myFolder2:myFile");
End SQL

Begin SQL
  INSERT INTO theTable ( ID, theColumn )
  VALUES (1, INFILE "C:\\myFolder\myFolder2\myFile");
End SQL