break;
} else if (strlen(sqlInput) == 0) {
/* Don"t process the statement */
printf ("tNo characters entered.n");
} else if (sqlInput[strlen(sqlInput) - 1] == "") {
/* 查看是否有续行 */
strcpy (st, "");
do {
strncat (st, sqlInput, strlen(sqlInput) -1);
gets (sqlInput);
} while (sqlInput[strlen(sqlInput) - 1] == "");
strcat (st, sqlInput);
/* 处理SQL语句 */
rc = process_statement (st);
} else {
strcpy (st, sqlInput);
/* 处理输入的SQL语句*/
rc = process_statement (st);
} /* end if */
} /* end while */
printf ("Enter "c" to COMMIT or Any Other key to ROLLBACK the transaction :n");
Transaction = getc(stdin);
if (Transaction == "c") {
printf("COMMITING the transactions.n");
/提交结果*/
EXEC SQL COMMIT;
CHECKERR ("COMMIT");
} else {
/* 撤消语句的执行结果*/
printf("ROLLING BACK the transactions.n");
EXEC SQL ROLLBACK;
CHECKERR ("ROLLBACK");
}; /* endif */
/*断开数据库的连接*/
EXEC SQL CONNECT RESET;
CHECKERR ("CONNECT RESET");
return 0;
}
/************************************************************************
* 函数 : process_statement
* This function processes the inputted statement and then prepares the
* procedural SQL implementation to take place.
*************************************************************************/
int process_statement (char sqlInput[1000]) {
int counter = 0;
struct sqlda *sqldaPointer;
short sqlda_d ; /* Total columns */
short idx;
char buffer[4096];
char varname[1024];
char colnamelist[4096];
/*声明一个宿主变量,用于存放SQL语句*/
EXEC SQL BEGIN DECLARE SECTION;
char st[1000];
EXEC SQL END DECLARE SECTION;
/*向宿主变量中存放SQL语句*/
strcpy(st, sqlInput);
/* 分配SQLDA空间,以存放查询结果 */
init_da (&sqldaPointer, 1);
EXEC SQL PREPARE statement1 from :st;
if (CHECKERR ("PREPARE") != 0) return SQLCODE;
/*获得返回结果的描述信息,填入SQLDA结构*/
EXEC SQL DESCRIBE statement1 INTO :*sqldaPointer;
/* 判断DESCRIBE是否正确执行*/
if (SQLCODE != 0 &&
SQLCODE != SQL_RC_W236 &&
SQLCODE != SQL_RC_W237 &&
SQLCODE != SQL_RC_W238 &&
SQLCODE != SQL_RC_W239) {
/* An unexpected warning/error has occured. Check the SQLCA. */
if (CHECKERR ("DESCRIBE") != 0) return SQLCODE;
} /* end if */
/*如果SQLDA结构中的sqld大于0,则表明是一个SELECT语句,sqld值是列的个数*/
if (sqldaPointer->sqld > 0) {
/*判断是否有LOB列,若是,则需要双倍的SQLDA空间*/
if (strncmp(SQLSTATE, "01005", sizeof(SQLSTATE)) == 0) {
/* this output contains columns that need a DOUBLED SQLDA */
SETSQLDOUBLED (sqldaPointer, SQLDOUBLED);
init_da (&sqldaPointer, sqldaPointer->sqld * 2);
} else {
/*否则,只需要一个SQLDA */
init_da (&sqldaPointer, sqldaPointer->sqld);
} /* end if */
/* 对SQLDA 重新赋值*/
EXEC SQL DESCRIBE statement1 INTO :*sqldaPointer;
if (CHECKERR ("DESCRIBE") != 0) return SQLCODE;
/* 给SQLDA分配合适的内存空间*/
alloc_host_vars (sqldaPointer);
/* 声明游标*/
EXEC SQL DECLARE pcurs CURSOR FOR statement1;
/*打开游标*/
EXEC SQL OPEN pcurs;
if (CHECKERR ("OPEN") != 0) return SQLCODE;
/*查询一行,存放在SQLDA中*/
EXEC SQL FETCH pcurs USING DESCRIPTOR :*sqldaPointer;
if (CHECKERR ("FETCH") != 0) return SQLCODE;
/* 从SQLDA中获得列标题信息,并显示之*/
colnamelist[0] = 0;
for ( idx=0; idx< sqlda_d; idx)
{
strcat(colnamelist, readColName(sqldaPointer, idx, buffer));
If (idx < sqlda_d -1)
strcat(colnamelist, ",");
}
printf(“%sn”,colnamelist);
/*显示所有的行数据*/
while ( SQLCODE == 0 ) {
counter;
for ( idx=0; idx< sqlda_d; idx)
printf(“%s”,readCol(sqldaPointer, idx, buffer));
EXEC SQL FETCH pcurs USING DESCRIPTOR :*sqldaPointer ;
} /* endwhile */
/*关闭游标*/
EXEC SQL CLOSE pcurs;
if (CHECKERR ("CLOSE CURSOR") != 0) return SQLCODE;
推荐阅读
- 坚果pro2哪个版本值得买?坚果pro2各版本有什么区别?
- F4版与D2版相比有何特点
- 坚果Pro 2有几个版本?坚果Pro 2各版本价格多少?
- 墨者写作中查看历史版本具体操作步骤
- 完全版 ESQL/C资料三
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门
