6. Embedded SQL for BASIC : BASIC Variables and Data Types : The Scope of Variables
 
Share this page                  
The Scope of Variables
All variables declared in an Embedded SQL declaration section can be referenced, and are accepted by the preprocessor, from the point of declaration to the end of the file. This may not be true for the BASIC compiler, which only allows variables to be referred to in the scope of the program unit in which they were declared. If you have two unrelated subprograms in the same file, each of which contains a variable with the same name to be used by Embedded SQL, you should not re-declare the variable to Embedded SQL. The preprocessor will use the data type information supplied the first time you declared the variable.
In the following program fragment, the variable "dbname" is passed as a parameter between two subroutines. In the first subroutine, the variable is a local variable. In the second subroutine, the variable is a formal parameter passed as a string to be used with the connect statement. In both subroutines, the preprocessor uses the data attributes from the variable's declaration in the first subroutine.
Example: Variable declaration
100    sub Scopes
    exec sql include sqlca
    exec sql begin declare section
        declare string dbname
    exec sql end declare section
    ! Prompt for and read database name
    print 'Database: '
    input dbname
    call open_db(dbname)
    ...

    end sub

200    sub Open_Db(string dbname)

    exec sql include sqlca
    exec sql whenever sqlerror stop
    exec sql connect :dbname 
            ! Declared to SQL in first subroutine
    ...
    end sub
Special care should be taken when using variables in a declare cursor statement. The variables used in such a statement must also be valid in the scope of the open statement for that same cursor. The preprocessor actually generates the code for the declare at the point that the open is issued and, at that time, evaluates any associated variables.
For example, in the following program fragment, even though the variable "number" is valid to the preprocessor at the point of both the declare cursor and open statements, it is not an explicitly declared variable name for the BASIC compiler at the point that the open is issued, possibly resulting in a runtime error. Because BASIC allows implicit variable declarations (although Embedded SQL does not), the compiler itself will not, however, generate an error message.
100    sub Init_Csr ! This example contains an error
    exec sql include sqlca
    exec sql begin declare section
        declare integer number ! a local variable
    exec sql end declare section
    exec sql declare cursor1 cursor for &
        select ename, age &
        from employee &
        where eno = :number
                ! initialize "number" to a particular value
        ...
    end sub

200            sub process_csr
    exec sql include sqlca
    exec sql begin declare section
        declare string ename
        declare integer eage
    exec sql end declare section
    exec sql open cursor1
             ! illegal evaluation of "number"
    exec sql fetch cursor1 into :ename, :eage

end sub
Note that you must issue include sqlca statement in each subprogram containing Embedded SQL statements.