Following is an example that uses prepare and fetch with dynamic parameter markers and SQL descriptors.
exec sql include sqlca;
exec sql include sqlda;
...
SQLDA *input_descriptor, *output_descriptor;
CS_SMALLINT small;
CS_CHAR character[20];
input_descriptor = (SQLDA *)malloc(SYB_SQLDA_SIZE(3));
input_descriptor->sqlda_sqln = 3;
output_descriptor = (SQLDA *)malloc(SYB_SQLDA_SIZE(3));
output_descriptor->sqlda_sqln = 3;
*p_retcode = CS_SUCCEED;
exec sql connect “sa” identified by ““;
/* setup */
exec sql drop table example;
exec sql create table example (fruit char(30), number int);
exec sql insert example values (‘tangerine’, 1);
exec sql insert example values (‘pomegranate’, 2);
exec sql insert example values (‘banana’, 3);
/* Prepare and describe the select statement */
exec sql prepare statement from
“select fruit from example where number = ?”;
exec sql describe input statement using descriptor input_descriptor;
input_descriptor->sqlda_column[0].sqlda_datafmt.datatype = CS_SMALLINT_TYPE;
input_descriptor->sqlda_column[0].sqlda_sqldata = &small;
input_descriptor->sqlda_column[0].sqlda_sqllen = sizeof(small);
small = 2;
exec sql describe output statement using descriptor
output_descriptor;
if (output_descriptor->sqlda_sqld != 1 ||
output_descriptor->sqlda_column[0].sqlda_datafmt.datatype != CS_CHAR_TYPE)
FAIL;
else
printf(“First describe output \n”);
output_descriptor->sqlda_column[0].sqlda_sqldata = character;
output_descriptor->sqlda_column[0].sqlda_datafmt.maxlength = 20;
exec sql execute statement into descriptor output_descriptor
using descriptor input_descriptor;
printf(“Expected pomegranate, got %s\n”, character);
exec sql deallocate prepare statement;
/* Prepare and describe second select statement */
exec sql prepare statement from
“select number from example where fruit = ?”;
exec sql declare c cursor for statement;
exec sql describe input statement using descriptor
input_descriptor;
input_descriptor->sqlda_column->sqlda_sqldata = character;
input_descriptor->sqlda_column->sqlda_datafmt.maxlength = CS_NULLTERM;
strcpy(character, “banana”);
input_descriptor->sqlda_column->sqlda_sqllen = CS_NULLTERM;
exec sql open c using descriptor input_descriptor;
exec sql describe output statement using descriptor
output_descriptor;
output_descriptor->sqlda_column->sqlda_sqldata = character;
output_descriptor->sqlda_column->sqlda_datafmt.datatype = CS_CHAR_TYPE;
output_descriptor->sqlda_column->sqlda_datafmt.maxlength = 20;
output_descriptor->sqlda_column->sqlda_sqllen = 20;
output_descriptor->sqlda_column->sqlda_datafmt.format =
(CS_FMT_NULLTERM | CS_FMT_PADBLANK);
exec sql fetch c into descriptor output_descriptor;
printf(“Expected pomegranate, got %s\n”, character);
exec sql commit work;