SQL プリプロセッサはポインタや参照式を認識しないため、ホスト変数は単純な名前でなければなりません。たとえば、次の文では、SQL プリプロセッサがドット演算子を理解しないため、正しく機能しません。同じ構文が、SQL では違う意味を持ちます。
// Incorrect statement: EXEC SQL SELECT LAST sales_id INTO :mystruct.mymember; |
上記の構文は使用できませんが、次の方法で式を使用できます。
SQL 宣言セクションを #if 0 プリプロセッサ・ディレクティブで囲む。SQL プリプロセッサはプリプロセッサ・ディレクティブを無視するため、この宣言を読み込み、残りのモジュールで使用します。
マクロをホスト変数と同じ名前で定義する。#if ディレクティブがあるため C コンパイラからは SQL 宣言セクションが見えず、競合が起きません。マクロがホスト変数と同じ型であると評価されることを確認してください。
次のコードは、SQL プリプロセッサから host_value 式を隠す方法を示しています。
#include <sqlerr.h> #include <stdio.h> EXEC SQL INCLUDE SQLCA; typedef struct my_struct { long host_field; } my_struct; #if 0 // Because it ignores #if preprocessing directives, // SQLPP reads the following declaration. EXEC SQL BEGIN DECLARE SECTION; long host_value; EXEC SQL END DECLARE SECTION; #endif // Make C/C++ recognize the 'host_value' identifier // as a macro that expands to a struct field. #define host_value my_s.host_field |
SQLPP プロセッサは条件付きコンパイルのディレクティブを無視するため、host_value は long ホスト変数として扱われ、その後ホスト変数として使用されたときにその名前を生成します。C/C++ コンパイラはこの生成されたファイルを処理し、このように名前が使用されている場合には my_s.host_field に置き換えます。
前述の宣言を使用した場合、次のようにして host_field にアクセスできます。
void main( void ) { my_struct my_s; db_init( &sqlca ); EXEC SQL CONNECT "DBA" IDENTIFIED BY "SQL"; EXEC SQL DECLARE my_table_cursor CURSOR FOR SELECT int_col FROM my_table order by int_col; EXEC SQL OPEN my_table_cursor; for( ; ; ) { // :host_value references my_s.host_field EXEC SQL FETCH NEXT AllRows INTO :host_value; if( SQLCODE == SQLE_NOTFOUND ) { break; } printf( "%ld\n", my_s.host_field ); } EXEC SQL CLOSE my_table_cursor; EXEC SQL DISCONNECT; db_fini( &sqlca ); } |
同じ方法で、他の lvalue をホスト変数として使用できます。
ポインタの間接参照
*ptr p_struct->ptr (*pp_struct)->ptr |
配列参照
my_array[ I ] |
任意の複雑な lvalue
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |