Preparing the SELECT Statement to Read Data from a Blob for Execution
From InterBase
Go Up to Reading Data from a Blob
After an XSQLDA
is created for holding the column data for each selected row, the query statement string can be prepared for execution. Follow these steps:
- Declare and initialize a SQL statement handle, then allocate it with
isc_dsql_allocate_statement()
:isc_stmt_handle stmt; /* Declare a statement handle. */ stmt = NULL; /* Set handle to NULL before allocation. */ isc_dsql_allocate_statement(status_vector, &db_handle, &stmt);
- Ready the statement string for execution with
isc_dsql_prepare()
. This checks the string (str
) for syntax errors, parses it into a format that can be efficiently executed, and sets the statement handle (stmt
) to refer to this parsed format. The statement handle is used in a later call toisc_dsql_execute
(). Ifisc_dsql_prepare()
is passed a pointer to the outputXSQLDA
, as in the following example, it will fill in most fields of theXSQLDA
and all itsXSQLVAR
substructures with information such as the data type, length, and name of the corresponding columns in the statement. A sample call toisc_dsql_prepare()
is:isc_dsql_prepare( status_vector, &trans, /* Set by previous isc_start_transaction() call. */ &stmt, /* Statement handle set by this function call. */ 0, /* Specifies statement string is null-terminated. */ str, /* Statement string. */ 1, /* da_version number. */ out_sqlda ); /* XSQLDA for storing column data. */
- Set up an
XSQLVAR
structure for each column. Setting up anXSQLVAR
structure involves the following steps:
For columns whose types are known at compile time :- a. Specify the data type of a column (if it was not set by
isc_dsql_prepare()
, as previously described). - b. Point the
sqldata
field of theXSQLVAR
to an appropriate local variable.
- c. Coerce the data type of the item (optional), for example, from
SQL_VARYING
toSQL_TEXT
. - d. Dynamically allocate local storage for the data pointed to by the
sqldata
field of theXSQLVAR
.
- e. Specify the number of bytes of data to be retrieved into
sqldata
. - f. Provide a
NULL
value indicator for the parameter.
XSQLVAR
fields must be set differently. For non-Blob (and non-array) columns,isc_dsql_prepare()
sets eachXSQLVAR
sqltype
field to the appropriate field type, and the data retrieved when a data of a select-list row is fetched is placed into thesqldata
space allocated for the column. For Blob columns, the type must be set to SQL_Blob (or SQL_Blob + 1 if aNULL
indicator is desired). InterBase stores the internal Blob identifier (Blob ID), not the Blob data, in thesqldata
space when a data of a row is fetched, so you must pointsqldata
to an area the size of a Blob ID. To see how to retrieve the actual Blob data once you have a Blob ID, see Reading Data from a Blob. The following code example illustrates the assignments for Blob and non-Blob columns whose types are known at compile time. For examples of handling data types that are unknown until run time, see Working with Dynamic SQL.#define PROJLEN 20 #define TYPELEN 12 ISC_QUAD blob_id; char proj_name[PROJLEN + 1]; char prod_type[TYPELEN + 1]; short flag0, flag1, flag2; out_sqlda->sqlvar[0].sqldata = proj_name; out_sqlda->sqlvar[0].sqltype = SQL_TEXT + 1; out_sqlda->sqlvar[0].sqllen = PROJLEN; out_sqlda->sqlvar[0].sqlind = &flag0; out_sqlda->sqlvar[1].sqldata = (char *) &blob_id; out_sqlda->sqlvar[1].sqltype = SQL_Blob + 1; out_sqlda->sqlvar[1].sqllen = sizeof(ISC_QUAD); out_sqlda->sqlvar[1].sqlind = &flag1; out_sqlda->sqlvar[2].sqldata = prod_type; out_sqlda->sqlvar[2].sqltype = SQL_TEXT + 1; out_sqlda->sqlvar[2].sqllen = TYPELEN; out_sqlda->sqlvar[2].sqlind = &flag2;
- a. Specify the data type of a column (if it was not set by