Allocates space for an SQL descriptor area (SQLDA).
ALLOCATE DESCRIPTOR descriptor-name … [ WITH MAX { integer | host-variable } ]
#include <stdio.h> #include <stdlib.h> #include <string.h> EXEC SQL INCLUDE SQLCA; #include <sqldef.h> EXEC SQL BEGIN DECLARE SECTION; int x; short type; int numcols; char string[100]; a_sql_statement_number stmt = 0; EXEC SQL END DECLARE SECTION; int main(int argc, char * argv[]) { struct sqlda * sqlda1; if( !db_init( &sqlca ) ) { return 1; } db_string_connect(&sqlca, "UID=dba;PWD=sql;DBF=d:\\IQ-16_0\\sample.db"); EXEC SQL ALLOCATE DESCRIPTOR sqlda1 WITH MAX 25; EXEC SQL PREPARE :stmt FROM 'select * from Employees'; EXEC SQL DECLARE curs CURSOR FOR :stmt; EXEC SQL OPEN curs; EXEC SQL DESCRIBE :stmt into sqlda1; EXEC SQL GET DESCRIPTOR sqlda1 :numcols=COUNT; // how many columns? if( numcols > 25 ) { // reallocate if necessary EXEC SQL DEALLOCATE DESCRIPTOR sqlda1; EXEC SQL ALLOCATE DESCRIPTOR sqlda1 WITH MAX :numcols; } type = DT_STRING; // change the type to string EXEC SQL SET DESCRIPTOR sqlda1 VALUE 2 TYPE = :type; fill_sqlda( sqlda1 ); // allocate space for the variables EXEC SQL FETCH ABSOLUTE 1 curs USING DESCRIPTOR sqlda1; EXEC SQL GET DESCRIPTOR sqlda1 VALUE 2 :string = DATA; printf("name = %s", string ); EXEC SQL DEALLOCATE DESCRIPTOR sqlda1; EXEC SQL CLOSE curs; EXEC SQL DROP STATEMENT :stmt; db_string_disconnect( &sqlca, "" ); db_fini( &sqlca ); return 0; }
You must declare the following in your C code prior to using this statement:
struct sqlda * descriptor_name
You must still call fill_sqlda to allocate space for the actual data items before doing a fetch or any statement that accesses the data within a descriptor area.