Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » UltraLite - C- und C++-Programmierung » Anwendungsentwicklung » Anwendungen mit Embedded SQL entwickeln » Hostvariable verwenden

 

Aufgaben von Hostvariablen

Die Deklaration einer Hostvariable kann überall dort stehen, wo auch eine C-Variablendeklaration stehen kann. Das gilt auch für den Parameterdeklarationsabschnitt einer C-Funktion. Die dort deklarierten C-Variable haben ihre normalen Aufgaben (sie stehen innerhalb des Blocks zur Verfügung, in dem sie definiert sind). Da aber der SQL-Präprozessor den C-Code nicht durchsucht, erkennt er keine C-Blöcke.

Präprozessor geht von globalen Hostvariablen aus

Der SQL-Präprozessor geht davon aus, dass Hostvariable im Anschluss an ihre Deklaration im Quellmodul global bekannt sind. Zwei Hostvariable können nicht den gleichen Namen haben. Die einzige Ausnahme zu dieser Regel: Zwei Hostvariable können den gleichen Namen haben, wenn sie vom gleichen Typ sind (einschließlich gegebenenfalls der Länge).

Am Besten erhält jede Hostvariable einen eindeutigen Namen.

Beispiele

Da der SQL-Präprozessor C-Code nicht syntaktisch analysieren kann, geht er davon aus, dass alle Hostvariable, unabhängig davon, wo sie deklariert wurden, im Anschluss an ihre Deklaration global bekannt sind.

// Example demonstrating poor coding
EXEC SQL BEGIN DECLARE SECTION;
   long emp_id;
EXEC SQL END DECLARE SECTION;
long getManagerID( void )
{
   EXEC SQL BEGIN DECLARE SECTION;
      long manager_id = 0;
   EXEC SQL END DECLARE SECTION;
   EXEC SQL SELECT manager_id
            INTO :manager_id
            FROM employee
            WHERE emp_number = :emp_id;
   return( manager_number );
}
void setManagerID( long manager_id )
{
   EXEC SQL UPDATE employee
            SET manager_number = :manager_id
            WHERE emp_number = :emp_id;
}

Der oben angegebene Code funktioniert zwar, ist aber verwirrend, da der SQL-Präprozessor von der Deklaration in getManagerID abhängig ist, wenn die Anweisung in setManagerID verarbeitet wird. Sie können diesen Code besser wie folgt schreiben:

// Rewritten example
#if 0
   // Declarations for the SQL preprocessor
   EXEC SQL BEGIN DECLARE SECTION;
      long emp_id;
      long manager_id;
   EXEC SQL END DECLARE SECTION;
#endif
long getManagerID( long emp_id )
{
   long manager_id = 0;
   EXEC SQL SELECT manager_id
            INTO :manager_id
            FROM employee
            WHERE emp_number = :emp_id;
   return( manager_number );
}
void setManagerID( long emp_id, long manager_id )
{
   EXEC SQL UPDATE employee
            SET manager_number = :manager_id
            WHERE emp_number = :emp_id;
}

Der SQL-Präprozessor sieht die Deklaration der Hostvariable innerhalb der #if-Direktive, weil er diese Direktiven ignoriert. Andererseits ignoriert er die Deklarationen innerhalb dieser Prozeduren, da sie sich nicht innerhalb von DECLARE SECTION befinden. Der C-Compiler ignoriert seinerseits die Deklarationen innerhalb der #if-Direktive und verwendet sie innerhalb der Prozeduren.

Diese Deklarationen funktionieren nur, weil Variable mit demselben Namen deklariert sind und denselben Typ haben.