C 言語では、文字列は文字の配列に格納されます。動的文は C 言語の文字列で構成されます。この文は PREPARE 文と EXECUTE 文を使用して実行できます。この SQL 文は静的文と同じようにしてホスト変数を参照することはできません。C 言語の変数は、C プログラムの実行中に変数名でアクセスできないためです。
SQL 文と C 言語の変数との間で情報をやりとりするために、「SQLDA」 (「SQL Descriptor Area」) 構造体が使用されます。EXECUTE 文の USING 句を使ってホスト変数のリストを指定すると、SQL プリプロセッサが自動的にこの構造体を用意します。ホスト変数のリストは、準備文の適切な位置にあるプレースホルダに順番に対応しています。
SQLDA の詳細については、SQLDA (SQL descriptor area)を参照してください。
「プレースホルダ」は文の中に置いて、どこでホスト変数にアクセスするかを指定します。プレースホルダは、疑問符 (?) か静的文と同じホスト変数参照です (ホスト変数名の前にはコロンを付けます)。ホスト変数参照の場合も、実際の文テキスト内のホスト変数名は SQLDA を参照することを示すプレースホルダの役割しかありません。
データベースに情報を渡すのに使用するホスト変数を「バインド変数」と呼びます。
次に例を示します。
EXEC SQL BEGIN DECLARE SECTION; char comm[200]; char Street[30]; char City[20]; short int cityind; long empnum; EXEC SQL END DECLARE SECTION; ... sprintf( comm, "UPDATE %s SET Street = :?, City = :?" "WHERE EmployeeID = :?", tablename ); EXEC SQL PREPARE S1 FROM :comm; EXEC SQL EXECUTE S1 USING :Street, :City:cityind, :empnum; |
この方法では、文中にいくつのホスト変数があるかを知っている必要があります。通常はそのようなことはありません。そこで、自分で SQLDA 構造体を設定し、この SQLDA を EXECUTE 文の USING 句で指定します。
DESCRIBE BIND VARIABLES 文は、準備文内にあるバインド変数のホスト変数名を返します。これにより、C プログラムでホスト変数を管理するのが容易になります。一般的な方法を次に示します。
EXEC SQL BEGIN DECLARE SECTION; char comm[200]; EXEC SQL END DECLARE SECTION; ... sprintf( comm, "UPDATE %s set Street = :Street, City = :City" " WHERE EmployeeID = :empnum", tablename ); EXEC SQL PREPARE S1 FROM :comm; /* Assume that there are no more than 10 host variables. * See next example if you cannot put a limit on it. */ sqlda = alloc_sqlda( 10 ); EXEC SQL DESCRIBE BIND VARIABLES FOR S1 INTO sqlda; /* sqlda->sqld will tell you how many host variables there were. */ /* Fill in SQLDA_VARIABLE fields with values based on name fields in sqlda. */ ... EXEC SQL EXECUTE S1 USING DESCRIPTOR sqlda; free_sqlda( sqlda ); |
SQLDA は変数記述子の配列です。各記述子は、対応する C プログラム変数の属性、または、データベースがデータを出し入れするロケーションを記述します。
SQLDA 構造体の詳細については、SQLDA (SQL descriptor area)を参照してください。
インジケータ変数はデータベースに NULL 値を渡したり、データベースから NULL 値を取り出すのに使用されます。インジケータ変数は、データベース操作中にトランケーション条件が発生したことをデータベース・サーバが示すのにも使用されます。インジケータ変数はデータベースの値を受け取るのに十分な領域がない場合、正の値に設定されます。
詳細については、インジケータ変数を参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |