シングルローだけを返す SELECT 文は、動的に準備し、その後に EXECUTE 文に INTO 句を指定してローを 1 つだけ取り出すようにできます。ただし、複数ローを返す SELECT 文では動的カーソルを使用します。
動的カーソルでは、結果はホスト変数のリスト、または FETCH 文 (FETCH INTO と FETCH USING DESCRIPTOR) で指定する SQLDA に入ります。通常、SELECT リスト項目の数は不明であるため、多くの場合、SQLDA を使用します。DESCRIBE SELECT LIST 文で SQLDA に SELECT リスト項目の型を設定します。その後、fill_sqlda 関数または fill_s_sqlda 関数を使用して、値用の領域を割り付けます。情報は FETCH USING DESCRIPTOR 文で取り出します。
次は典型的な例です。
EXEC SQL BEGIN DECLARE SECTION; char comm[200]; EXEC SQL END DECLARE SECTION; int actual_size; SQLDA * sqlda; ... sprintf( comm, "SELECT * FROM %s", table_name ); EXEC SQL PREPARE S1 FROM :comm; /* Initial guess of 10 columns in result. If it is wrong, it is corrected right after the first DESCRIBE by reallocating sqlda and doing DESCRIBE again. */ sqlda = alloc_sqlda( 10 ); EXEC SQL DESCRIBE SELECT LIST FOR S1 INTO sqlda; if( sqlda->sqld > sqlda->sqln ) { actual_size = sqlda->sqld; free_sqlda( sqlda ); sqlda = alloc_sqlda( actual_size ); EXEC SQL DESCRIBE SELECT LIST FOR S1 INTO sqlda; } fill_sqlda( sqlda ); EXEC SQL DECLARE C1 CURSOR FOR S1; EXEC SQL OPEN C1; EXEC SQL WHENEVER NOTFOUND {break}; for( ;; ) { EXEC SQL FETCH C1 USING DESCRIPTOR sqlda; /* do something with data */ } EXEC SQL CLOSE C1; EXEC SQL DROP STATEMENT S1; |
リソースを無駄に消費しないように、文は使用後に削除してください。
動的カーソルのサンプルは、動的 SELECT 文でのカーソルの使用方法を示しています。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |