#include
int init_da (SQLDA **DAPointer, int DAsqln); /*为存放列数据的sd_column结构申请空间*/ int alloc_host_vars (SQLDA *sqldaPointer); /*释放SQLDA所申请的空间*/ void free_da (SQLDA *sqldaPointer); /*获取列名信息*/
char * readColName (SQLDA *sqldaPointer, short sd_columnIndex, char * buffer); /*获取列数据*/
char * readCol (SQLDA *sqldaPointer, short sd_columnIndex, char * buffer); #ifdef __cplusplus } #endif
/*定义最大列数*/
#define MAX_COLUMNS255
#define MAX_CHAR_FOR_DOUBLE20 #define MAX_CHAR_FOR_LONG15 #define MAX_CHAR_FOR_DATETIME30 #define MAX_CHAR_FOR_DEFAULT100 EXEC SQL INCLUDE SQLCA ; EXEC SQL INCLUDE SQLDA ; #define SQLSTATE sqlca.sqlstate #define SQLCODE sqlca.sqlcode /*处理SQL语句*/
int process_statement( char * ) ; int main() { int rc ; char st[1024]; char tmpstr[1024]; /*获得SQL语句*/
printf(Please enter the any sql statement:); gets( st); /* 处理该语句 */
rc = process_statement( st ) ; /*打印处理结果*/ printf( %d, rc);
printf(the sqlcode is %d,SQLCODE); }
/****************************************************************************** * FUNCTION : process_statement * 处理SQL语句
*****************************************************************************/ int process_statement ( char * sqlInput ) { int counter = 0 ; SQLDA * sqldaPointer ;
short sqlda_d ; /* Total columns */ short idx; char buffer[4096]; char varname[1024]; char colnamelist[4096];
EXEC SQL BEGIN DECLARE SECTION ; char st[1024] ;
EXEC SQL END DECLARE SECTION ; strcpy( st, sqlInput ) ; /* 为SQLDA结构申请空间 */
if (init_da( &sqldaPointer, MAX_COLUMNS ) == -1) { return -1; }
/*准备SQL语句*/
EXEC SQL PREPARE statement1 from :st ; if (SQLCODE < 0) {
free_da(sqldaPointer); return SQLCODE; }
/*获取查询列的信息到SQLDA结构*/
EXEC SQL DESCRIBE statement1 USING DESCRIPTOR sqldaPointer ; /* 如果SQLCODE为0,则表示为SELECT语句 */ if ( SQLCODE != 0 ) { free_da(sqldaPointer); return SQLCODE; } /* end if */
sqlda_d = sqldaPointer->sd_sqld ; if ( sqlda_d > 0 ) {
/* 为存放列数据的sd_column结构申请空间 */ if (alloc_host_vars( sqldaPointer ) == -1) {free_da(sqldaPointer); return -1; }
/*声明游标*/
EXEC SQL DECLARE pcurs CURSOR FOR statement1 ; /打开游标*/
EXEC SQL OPEN pcurs ; if (SQLCODE < 0)
return SQLCODE;
/*取一行数据到SQLDA结构*/
EXEC SQL FETCH pcurs INTO DESCRIPTOR sqldaPointer; if (SQLCODE < 0) {
EXEC SQL CLOSE pcurs ; return SQLCODE; }
/*显示列标题 */ colnamelist[0] = 0;
for ( idx=0; idx< sqlda_d; idx++)
{ strcat(colnamelist, readColName(sqldaPointer, idx, buffer)); if (idx < sqlda_d -1) strcat(colnamelist, ,); }
/* 显示行数据*/
while ( SQLCODE == 0 ) { counter++ ;
for ( idx=0; idx< sqlda_d; idx++)
printf(%s,readCol(sqldaPointer, idx, buffer));
EXEC SQL FETCH pcurs INTO DESCRIPTOR sqldaPointer ; } /* endwhile */ /*关闭游标*/
EXEC SQL CLOSE pcurs ;
EXEC SQL DEALLOCATE CURSOR pcurs; /* 释放为SQLDA申请的空间 */ free_da( sqldaPointer ) ; } else { /* 不是SELECT语句*/ EXEC SQL EXECUTE statement1 ; free_da( sqldaPointer ) ; if (SQLCODE < 0) return SQLCODE; } /* end if */ return( 0 ) ;
} /* end of program : ADHOC.CP */
/******************************************************************************* PROCEDURE : init_da *为SQLDA分配空间。使用SQLDASIZE 获得SQLDA的大小。如果返回-1,则表示分配 *空间不成功。
******************************************************************************/ int init_da (SQLDA **DAPointer, int DAsqln) { int idx;
*DAPointer = (SQLDA *)malloc(SYB_SQLDA_SIZE(DAsqln)); if (*DAPointer == NULL) return (-1);
memset (*DAPointer, \\0, SYB_SQLDA_SIZE(DAsqln)); (*DAPointer)->sd_sqln = DAsqln; (*DAPointer)->sd_sqld = 0; return 0; }
/******************************************************************************* FUNCTION : alloc_host_vars *为存放列数据的sd_column结构申请空间。如果返回-1,则表示不能获得足够内存。 ******************************************************************************/ int alloc_host_vars (SQLDA *sqldaPointer) { short idx;
for (idx = 0; idx < sqldaPointer->sd_sqld; idx++) {
switch (sqldaPointer->sd_column[idx].sd_datafmt.datatype ) { case CS_CHAR_TYPE: case CS_VARCHAR_TYPE:
sqldaPointer->sd_column[idx].sd_datafmt.datatype = CS_CHAR_TYPE;
sqldaPointer->sd_column[idx].sd_sqldata = (char *) malloc (sqldaPointer->sd_column[idx].sd_sqllen + 1 );
sqldaPointer->sd_column[idx].sd_sqllen ++;
sqldaPointer->sd_column[idx].sd_datafmt.format = CS_FMT_NULLTERM; break;
case CS_TINYINT_TYPE: case CS_SMALLINT_TYPE: case CS_INT_TYPE: case CS_VOID_TYPE: case CS_USHORT_TYPE:
sqldaPointer->sd_column[idx].sd_datafmt.datatype = CS_CHAR_TYPE;
sqldaPointer->sd_column[idx].sd_sqldata = (char *) malloc (MAX_CHAR_FOR_LONG); sqldaPointer->sd_column[idx].sd_sqllen = MAX_CHAR_FOR_LONG; sqldaPointer->sd_column[idx].sd_datafmt.format = CS_FMT_NULLTERM; break;
case CS_REAL_TYPE: case CS_FLOAT_TYPE: case CS_BIT_TYPE: case CS_MONEY_TYPE: case CS_MONEY4_TYPE:
sqldaPointer->sd_column[idx].sd_datafmt.datatype = CS_CHAR_TYPE;
sqldaPointer->sd_column[idx].sd_sqldata = (char *) malloc (MAX_CHAR_FOR_DOUBLE); sqldaPointer->sd_column[idx].sd_sqllen = MAX_CHAR_FOR_DOUBLE; sqldaPointer->sd_column[idx].sd_datafmt.format = CS_FMT_NULLTERM; break;
case CS_DATETIME_TYPE: case CS_DATETIME4_TYPE:
sqldaPointer->sd_column[idx].sd_datafmt.datatype = CS_CHAR_TYPE;
sqldaPointer->sd_column[idx].sd_sqldata = (char *) malloc (MAX_CHAR_FOR_DATETIME); sqldaPointer->sd_column[idx].sd_sqllen = MAX_CHAR_FOR_DATETIME; sqldaPointer->sd_column[idx].sd_datafmt.format = CS_FMT_NULLTERM; break;
case CS_NUMERIC_TYPE: case CS_DECIMAL_TYPE:
sqldaPointer->sd_column[idx].sd_datafmt.datatype = CS_CHAR_TYPE; sqldaPointer->sd_column[idx].sd_sqldata = (char *) malloc (sqldaPointer->sd_column[idx].sd_datafmt.precision + 3 );
sqldaPointer->sd_column[idx].sd_sqllen = sqldaPointer->sd_column[idx].sd_datafmt.precision + 3; sqldaPointer->sd_column[idx].sd_datafmt.format = CS_FMT_NULLTERM; break; default:
sqldaPointer->sd_column[idx].sd_datafmt.datatype = CS_CHAR_TYPE;
sqldaPointer->sd_column[idx].sd_sqldata = (char *) malloc (MAX_CHAR_FOR_DEFAULT); sqldaPointer->sd_column[idx].sd_sqllen = MAX_CHAR_FOR_DEFAULT; sqldaPointer->sd_column[idx].sd_datafmt.format = CS_FMT_NULLTERM; break;
} /* endswitch */
if (sqldaPointer->sd_column[idx].sd_sqldata == NULL) { return (-1); }
} /* endfor */ return 0; }
/******************************************************************************* FUNCTION : free_da * 释放SQLDA申请的空间。
******************************************************************************/ void free_da (SQLDA *sqldaPointer) { short idx;
for (idx = 0; idx < sqldaPointer->sd_sqld; idx++) { free (sqldaPointer->sd_column[idx].sd_sqldata); } /* endfor */ free (sqldaPointer); }
/******************************************************************************* PROCEDURE : readColName * 返回列名
******************************************************************************/
char * readColName (SQLDA *sqldaPointer, short sd_columnIndex, char * buffer) { strcpy(buffer, sqldaPointer->sd_column[sd_columnIndex].sd_datafmt.name);