4. Embedded SQL for Fortran : Advanced Processing : Sample Programs : Dynamic SQL Handler
 
Share this page                  
Dynamic SQL Handler
The following examples are of a dynamic SQL handler program that uses the SQLDA. This program fragment shows the declaration and usage of a datahandler in a dynamic SQL program, using the SQLDA. It uses the datahandler Get_Handler() and the HDLR_PARAM structure described in the previous example.
UNIX
C main program using SQLDA
C *************************
        program dynamic_hdlr
        exec sql include sqlca 
        exec sql include sqlda 
C   Do not declare the datahandlers nor the datahandler argument
C   to the ESQL pre-processor.

        external  Put_Handler
        integer*4 Put_Handler
        external  Get_Handler
        integer*4 Get_Handler
C  Declare argument to be passed to datahandler.
        structure          /hdlr_arg/
            character*100     argstr
            integer*4         argint
        end structure
        record /hdlr_arg/ hdlarg
C  Declare SQLDA and IISQLHDLR
        record /IISQLDA/ sqlda
            common /sqlda_area/sqlda
        record /IISQLHDLR/ dathdlr

        integer base_type

C   Declare null indicator to ESQL
        exec sql begin declare section
            integer*2       indvar
            Character*100   stmt_buf
        exec sql end declare section
        . . .
C  Set the IISQLHDLR structure with the appropriate datahandler
C  and datahandler argument.
     dathdlr.sqlhdlr = loc(Get_Handler)
     dathdlr.sqlarg  = loc(hdlarg)

C  Describe the statement into the SQLDA.

        stmt_buf = 'select * from book'.
        exec sql prepare stmt from :stmt_buf
        exec sql describe stmt into SQLDA
        . . .
C  Determine the base_type of the sqldata variables.
        do 20, i = 1, sqlda.sqld

                if (sqlda.sqlvar(i).sqltype .gt. 0) then
                    base_type = sqlda.sqlvar(i).sqltype
                else
                    base_type = -sqlda.sqlvar(i).sqltype
                end if
C Set the sqltype, sqldata and sqlind for each column
C The long varchar column chapter_text will be set to use a
C datahandler
        if (base_type .eq. IISQ_LVCH_TYPE) then
                sqlda.sqlvar(i).sqltype = IISQ_HDLR_TYPE
                sqlda.sqlvar(i).sqldata = loc(dathdlr)
                sqlda.sqlvar(i).sqlind = loc(indvar)
        else
                . . .
        end if

20        continue
C The Datahandler (Get_Handler) will be invoked for each non-null 
C value of column chapter_text retrieved. For null values the 
C indicator variable will be set to "-1" and the datahandler
C will not be called.

        . . .
        exec sql execute immediate :stmt_buf using :sqlda
        exec sql begin
                        process row...
        exec sql end
        . . .
        end  
VMS
C main program using SQLDA
C *************************
        program dynhdl
        exec sql include sqlca 
        exec sql include sqlda 


C  Do not declare the datahandlers nor the datahandler argument
C  to the ESQL pre-processor.

        external  Put_Handler
        integer*4 Put_Handler
        external  Get_Handler
        integer*4 Get_Handler
C   Declare argument to be passed to datahandler.
        structure          /hdlr_arg/
            character*100     argstr
            integer*4         argint
        end structure
        record /hdlr_arg/ hdlarg
C  Declare SQLDA and IISQLHDLR
        record /IISQLDA/ sqlda
            common /sqlda_area/sqlda
        record /IISQLHDLR/ dathdlr

        integer base_type
C   Declare null indicator to ESQL
    exec sql begin declare section
                integer*2       indvar
                Character*100   stmt_buf
    exec sql end declare section
            . . .
C  Set the IISQLHDLR structure with the appropriate datahandler and 
C  datahandler argument.
     dathdlr.sqlhdlr = %loc(Get_Handler)
     dathdlr.sqlarg  = %loc(hdlarg)

C  Describe the statement into the SQLDA.

    stmt_buf = 'select * from book'.
    exec sql prepare stmt from :stmt_buf
    exec sql describe stmt into SQLDA
    . . .
C  Determine the base_type of the sqldata variables.

    do 20, i = 1, sqlda.sqld

            if (sqlda.sqlvar(i).sqltype .gt. 0) then
                    base_type = sqlda.sqlvar(i).sqltype
            else
                    base_type = -sqlda.sqlvar(i).sqltype
            end if
C Set the sqltype, sqldata and sqlind for each column
C The long varchar column chapter_text will be set to use a
C datahandler
            if (base_type .eq. IISQ_LVCH_TYPE) then
                    sqlda.sqlvar(i).sqltype = IISQ_HDLR_TYPE
                    sqlda.sqlvar(i).sqldata = %loc(dathdlr)
                    sqlda.sqlvar(i).sqlind = %loc(indvar)
            else
                    . . .
            end if

20    continue
C  The Datahandler (Get_Handler) will be invoked for each non-null 
C  value of column chapter_text retrieved. For null values the 
C  indicator variable will be set to "-1" and the datahandler
C  will not be called.

            . . .
            exec sql execute immediate :stmt_buf using :sqlda
      exec sql begin
                process row...
            exec sql end
            . . .
      end  
Windows
C main program using SQLDA
C *************************
        program dynhdl
        exec sql include sqlca 
        exec sql include sqlda 

C  Do not declare the datahandlers nor the datahandler argument
C  to the ESQL pre-processor.

        external  Put_Handler
        integer*4 Put_Handler
        external  Get_Handler
        integer*4 Get_Handler
C   Declare argument to be passed to datahandler.
        structure          /hdlr_arg/
            character*100     argstr
            integer*4         argint
        end structure
        record /hdlr_arg/ hdlarg
C  Declare SQLDA and IISQLHDLR
        record /IISQLDA/ sqlda
            common /sqlda_area/sqlda
        record /IISQLHDLR/ dathdlr

        integer base_type

C   Declare null indicator to ESQL
    exec sql begin declare section
                integer*2       indvar
                Character*100   stmt_buf
    exec sql end declare section
            . . .
C  Set the IISQLHDLR structure with the appropriate datahandler and 
C  datahandler argument.
     dathdlr.sqlhdlr = %loc(Get_Handler)
     dathdlr.sqlarg  = %loc(hdlarg)

C  Describe the statement into the SQLDA.

    stmt_buf = 'select * from book'.
    exec sql prepare stmt from :stmt_buf
    exec sql describe stmt into SQLDA
    . . .
C  Determine the base_type of the sqldata variables.

    do 20, i = 1, sqlda.sqld

            if (sqlda.sqlvar(i).sqltype .gt. 0) then
                    base_type = sqlda.sqlvar(i).sqltype
            else
                    base_type = -sqlda.sqlvar(i).sqltype
            end if
C Set the sqltype, sqldata and sqlind for each column
C The long varchar column chapter_text will be set to use a
C datahandler
            if (base_type .eq. IISQ_LVCH_TYPE) then
                    sqlda.sqlvar(i).sqltype = IISQ_HDLR_TYPE
                    sqlda.sqlvar(i).sqldata = %loc(dathdlr)
                    sqlda.sqlvar(i).sqlind = %loc(indvar)
            else
                    . . .
            end if

20    continue
C  The Datahandler (Get_Handler) will be invoked for each non-null 
C  value of column chapter_text retrieved. For null values the 
C  indicator variable will be set to "-1" and the datahandler
C  will not be called.

            . . .
            exec sql execute immediate :stmt_buf using :sqlda
      exec sql begin
                process row...
            exec sql end
            . . .
      end