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.
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.
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.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |