Preparing and Executing a Statement String with Parameters (Embedded SQL Guide)
Go Up to Method 2: Non-query Statements with Parameters (Embedded SQL Guide)
After an XSQLDA is created for holding the parameters of a statement string, the statement string can be created and prepared. Local variables corresponding to the placeholder parameters in the string must be assigned to their corresponding sqldata fields in the XSQLVAR structures.
To prepare and execute a non-query statement string with parameters, follow these steps:
- 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 with placeholder parameters:
char *str = "UPDATE DEPARTMENT SET BUDGET = ?, LOCATION = ?";
This statement string contains two parameters: a value to be assigned to theBUDGETfield and a value to be assigned to theLOCATIONfield. - Parse and name the statement string with
PREPARE. The name is used in subsequent calls toDESCRIBEandEXECUTE:EXEC SQL PREPARE SQL_STMT FROM :str;
SQL_STMTis the name assigned to the prepared statement string. - Use
DESCRIBE INPUTto fill the input XSQLDA with information about the parameters contained in the SQL statement:EXEC SQL DESCRIBE INPUT SQL_STMT USING SQL DESCRIPTOR in_sqlda;
- Compare the value of the
sqlnfield of the XSQLDA to the value of thesqldfield to make sure enoughXSQLVARsare allocated to hold information about each parameter.sqlnshould be at least as large assqln. If not, free the storage previously allocated to the input descriptor, reallocate storage to reflect the number of parameters specified bysqld, resetsqlnandversion, then executeDESCRIBE INPUTagain:if (in_sqlda->sqld > in_sqlda->sqln) { n = in_sqlda->sqld; free(in_sqlda); in_sqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(n)); in_sqlda->sqln = n; in_sqlda->version = SQLDA_CURRENT_VERSION; EXEC SQL DESCRIBE INPUT SQL_STMT USING SQL DESCRIPTOR in_sqlda; } - Process each
XSQLVARparameter structure in the XSQLDA. Processing a parameter structure involves up to four steps:- Coercing the data type of a parameter (optional).
- Allocating local storage for the data pointed to by the
sqldatafield of theXSQLVAR. 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 value for the parameter consistent with its data type (required).
- Providing a
NULLvalue indicator for the parameter.
XSQLVARstructure in thein_sqldaXSQLDA:for (i=0, var = in_sqlda->sqlvar; i < in_sqlda->sqld; i++, var++) { /* Process each XSQLVAR parameter structure here. The parameter structure is pointed to by var.*/ dtype = (var->sqltype & ~1) /* drop NULL flag for now */ switch(dtype) { case SQL_VARYING: /* coerce to SQL_TEXT */ var->sqltype = SQL_TEXT; /* Allocate local variable storage. */ var->sqldata = (char *)malloc(sizeof(char)*var->sqllen); . . . break; case SQL_TEXT: var->sqldata = (char *)malloc(sizeof(char)*var->sqllen); /* Provide a value for the parameter. */ . . . break; case SQL_LONG: var->sqldata = (char *)malloc(sizeof(long)); /* Provide a value for the parameter. */ *(long *)(var->sqldata) = 17; break; . . . } /* End of switch statement. */ if (var->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 andNULLindicators, see Coercing Data Types (Embedded SQL Guide). - Execute the named statement string with
EXECUTE. Reference the parameters in the input XSQLDA with theUSING SQL DESCRIPTORclause. For example, the following statement executes a statement string namedSQL_STMT:EXEC SQL EXECUTE SQL_STMT USING SQL DESCRIPTOR in_sqlda;