UltraLite Embedded SQL User's Guide
Data Access Using Embedded SQL
Using host variables
A host-variable declaration section can appear anywhere that C variables can normally be declared, including the parameter declaration section of a C function. The C variables have their normal scope (available within the block in which they are defined). However, since the SQL preprocessor does not scan C code, it does not respect C blocks.
As far as the SQL preprocessor is concerned, host variables are globally known in the source module following their declaration. Two host variables cannot have the same name. The only exception to this rule is that two host variables can have the same name if they have identical types (including any necessary lengths).
The best practice is to give each host variable a unique name.
Because the SQL preprocessor can not parse C code, it assumes that all host variables, no matter where they are declared, are known globally following their declaration.
// 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; }
Although it works, the above code is confusing because the SQL preprocessor relies on the declaration inside getManagerID when processing the statement within setManagerID. You should rewrite this code as follows.
// 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; }
The SQL preprocessor sees the declaration of the host variables contained within the #if directive because it ignores these directives. On the other hand, it ignores the declarations within the procedures because they are not inside a DECLARE SECTION. Conversely, the C compiler ignores the declarations within the #if directive and uses those within the procedures.
These declarations work only because variables having the same name are declared to have exactly the same type.