Tips

SQL EXECUTEでセレクションを扱う

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

SQL EXECUTEは、動的に作成したSQL文を実行する時に使うのにとても便利なコマンドです。しかし、Begin SQL~End SQLで括られたSQL文とは少し振る舞いが違うために戸惑うことがあります。この違いについては、下記のページにまとめられています。

4D SQL Reference:SQLクエリの結果を変数に受け取る

SQL EXECUTEに結果を受けとるためには、このコマンドで変数またはフィールドをバインドし、実際に結果を受けとるためにはSQL LOAD RECORDを使うのです。実際の使い方はランゲージリファレンスにはいくつかの例題が掲載されていますので、それらが参考になると思います。

ランゲージリファレンス:SQL EXECUTE

SQL EXECUTEを実行して作成されたセレクションの値を取り出す方法ですが、ループ文を利用して取り出す方法がランゲージリファレンスの例題2に紹介されています。しかし、ランゲージリファレンスを良く見ると、もうひとつの方法も紹介されていることに気がつくかもしれません。それが、例題1です。

`ランゲージリファレンスより抜粋
SQLStmt:="SELECT ename FROM emp"
SQL EXECUTE(SQLStmt;[Employee]Name)
SQL LOAD RECORD(SQL All Records)

例題1は、SQL EXECUTEを実行して作成されたセレクションを基にして[Employee]テーブルに複数のレコードを作成する例です。この例でバインドされているのは[Employee]Nameフィールドですが、フィールドの代わりに配列を指定することができます。配列を指定する方法は、4D SQL Reference「SQLクエリの結果を変数に受け取る」にも紹介されていますが、ランゲージリファレンスの例題1を配列に受けとるように書き換えると下記のようになります。

ARRAY TEXT($Names;0)
SQLStmt:="SELECT ename FROM emp"
SQL EXECUTE(SQLStmt;$Names)
SQL LOAD RECORD(SQL All Records)

SQL EXECUTEでセレクションを扱うときのポイントは、SQL EXECUTEで配列かフィールドをバインドしSQL LOAD RECORDに定数「SQL All Records」を渡すことです。これによりSQL LOAD RECORDが実行されると、SQL EXECUTEによって作成されたセレクションの全レコードの値が、SQL EXECUTEでバインドした配列の要素として格納されることになります。この場合ループする必要は全くありません。