Hostvariablen müssen einfache Namen sein, da der SQL-Präprozessor Zeiger oder Referenzausdrücke nicht erkennt. Folgende Anweisung funktioniert nicht, weil der SQL-Präprozessor den Punkt-Operator nicht versteht. Dieselbe Syntax hat in SQL eine andere Bedeutung.
// Incorrect statement: EXEC SQL SELECT LAST sales_id INTO :mystruct.mymember; |
Obwohl die oben dargestellte Syntax nicht zulässig ist, können Sie dennoch mit folgender Methode einen Ausdruck verwenden:
Binden Sie den SQL-Deklarationsabschnitt in eine #if 0-Präprozessordirektive ein. Der SQL-Präprozessor liest die Deklarationen und verwendet sie für den Rest des Moduls, da er die Präprozessor-Direktiven ignoriert.
Definieren Sie einen Makro mit dem Namen der Hostvariable. Da der SQL-Deklarationsabschnitt vom C-Compiler aufgrund der #if-Direktive nicht gesehen wird, kommt es zu keinem Konflikt. Stellen Sie sicher, dass der Makro mit demselben Hostvariabletyp aufgelöst wird.
Der folgende Code veranschaulicht diese Methode, um den Ausdruck host_value vor dem SQL-Präprozessor zu verbergen.
#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 |
Da der SQLPP-Prozessor Direktiven für die bedingte Kompilierung ignoriert, wird host_value als Hostvariable vom Datentyp long behandelt, und wenn sie nachfolgend als Hostvariable verwendet wird, wird sie diesen Namen ausgeben. Der C/C++-Compiler verarbeitet die ausgegebene Datei und ersetzt alle entsprechenden Verwendungen des Namens durch my_s.host_field.
Mit den obigen Deklarationen können Sie auf host_field wie folgt zugreifen:
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 ); } |
Sie können mit derselben Methode andere lvalues-Werte als Hostvariablen verwenden:
Zeigerumleitungen
*ptr p_struct->ptr (*pp_struct)->ptr |
Array-Verweise
my_array[ I ] |
Beliebig komplexe lvalues-Werte
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |