Preparing a Query Statement String

From InterBase
Jump to: navigation, search

Go Up to Method 3: Query Statements Without Parameters (Embedded SQL Guide)


After an XSQLDA is created for holding the items returned by a query statement string, the statement string can be created, prepared, and described. When a statement string is executed, InterBase creates the select-list of selected rows.

To prepare a query statement string, follow these steps:

  1. Elicit a statement string from the user or create one that contains the SQL statement to be processed. For example, the following statement creates a SQL statement string that performs a query:
    char *str = "SELECT * FROM CUSTOMER";
    
    The statement appears to have only one select-list item (*). The asterisk is a wildcard symbol that stands for all of the columns in the table, so the actual number of items returned equals the number of columns in the table.
  2. Parse and name the statement string with PREPARE. The name is used in subsequent calls to statements such as DESCRIBE and EXECUTE:
    EXEC SQL
    PREPARE SQL_STMT FROM :str;
    
    SQL_STMT is the name assigned to the prepared statement string.
  3. Use DESCRIBE OUTPUT to fill the output XSQLDA with information about the select-list items returned by the statement:
    EXEC SQL
    DESCRIBE OUTPUT SQL_STMT INTO SQL DESCRIPTOR out_sqlda;
    
  4. Compare the sqln field of the XSQLDA to the sqld field to determine if the output descriptor can accommodate the number of select-list items specified in the statement. If not, free the storage previously allocated to the output descriptor, reallocate storage to reflect the number of select-list items specified by sqld, reset sqln and version, then execute DESCRIBE OUTPUT again:
    if (out_sqlda->sqld > out_sqlda->sqln)
    {
    n = out_sqlda->sqld;
    free(out_sqlda);
    out_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n));
    out_sqlda->sqln = n;
    out_sqlda->version = SQLDA_CURRENT_VERSION;
    EXEC SQL
    DESCRIBE OUTPUT SQL_STMT INTO SQL DESCRIPTOR out_sqlda;
    }
    
  5. Set up an XSQLVAR structure for each item returned. Setting up an item structure involves the following steps:
    • Coercing the data type of an item (optional).
    • Allocating local storage for the data pointed to by the sqldata field of the XSQLVAR. This step is only required if space for local variables is not allocated until run time. The following example illustrates dynamic allocation of local variable storage space.
    • Providing a NULL value indicator for the parameter.
    The following code example illustrates these steps, looping through each XSQLVAR structure in the out_sqlda XSQLDA:
    for (i=0, var = out_sqlda->sqlvar; i < out_sqlda->sqld; i++, var++)
    {
    dtype = (var->sqltype & ~1) /* drop flag bit for now */
    switch (dtype)
    {
    case SQL_VARYING:
    var->sqltype = SQL_TEXT;
    var->sqldata = (char *)malloc(sizeof(char)*var->sqllen + 2);
    break;
    case SQL_TEXT:
    var->sqldata = (char *)malloc(sizeof(char)*var->sqllen);
    break;
    case SQL_LONG:
    var->sqldata = (char *)malloc(sizeof(long));
    break;
    . . .
    /* process remaining types */
    } /* end of switch statements */
    if (sqltype & 1)
    {
    /* allocate variable to hold NULL status */
    var->sqlind = (short *)malloc(sizeof(short));
    }
    } /* end of for loop */
    

For more information about data type coercion and NULL indicators, see Coercing Data Types (Embedded SQL Guide).