SQLDA结构
N=3
V
L
T
I
F=1 describe设置
S
N
C
X
Y
Z
图6-5 SQLDA结构示例【完全版 ESQL/C资料三】 下面这个例子是一个adhoc程序 。用户输入任何合法的SQL语句(可以带参数),该程序能够处理这个语句,并打印出结果 。这个例子非常经典,说明使用SQLDA的两个功能 。
#include
#include
#include/* 列的最大数目或宿主变量的最大个数*/
#define MAX_ITEMS 40
/* 列名的最大长度或指示符的最大长度*/
#define MAX_VNAME_LEN 30
#define MAX_INAME_LEN 30
#ifndef NULL
#define NULL 0
#endifchar *dml_commands[] = {"SELECT", "select", "INSERT", "insert",
"UPDATE", "update", "DELETE", "delete"};
EXEC SQL BEGIN DECLARE SECTION;
char dyn_statement[1024];
EXEC SQL VAR dyn_statement IS STRING(1024);
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
EXEC SQL INCLUDE sqlda;
SQLDA *bind_dp;
SQLDA *select_dp;
extern SQLDA *SQLSQLDAAlloc();
extern void sqlnul();/* Define a buffer to hold longjmp state info. */
jmp_buf jmp_continue;/* A global flag for the error routine. */
int parse_flag = 0;main()
{
int oracle_connect();
int alloc_descriptors();
int get_dyn_statement();
int set_bind_variables();
int process_select_list();
int i;/*连接到数据库 */
if (oracle_connect() != 0)
exit(1);
/* 为SQLDA分配空间*/
if (alloc_descriptors(MAX_ITEMS, MAX_VNAME_LEN, MAX_INAME_LEN) != 0)
exit(1);
/* 处理SQL 语句*/
for (;;)
{
i = setjmp(jmp_continue);
/* 获取SQL语句 。输入"exit"表示退出 */
if (get_dyn_statement() != 0)
break;
/* 对该SQL语句做PREPARE操作 */
EXEC SQL WHENEVER SQLERROR DO sql_error();
parse_flag = 1; /* Set a flag for sql_error(). */
EXEC SQL PREPARE S FROM :dyn_statement;
parse_flag = 0; /* Unset the flag. */
/*声明游标*/
EXEC SQL DECLARE C CURSOR FOR S;
/* 提示用户输入参数值*/
set_bind_variables();
/* 打开游标 */
EXEC SQL OPEN C USING DESCRIPTOR bind_dp;/* 处理语句,并输出结果*/
process_select_list();/*输出处理的行数. */
for (i = 0; i < 8; i)
{
if (strncmp(dyn_statement, dml_commands[i], 6) == 0)
{
printf("nn%d row%c processed.n",
sqlca.sqlerrd[2],
sqlca.sqlerrd[2] == 1 ? "" : "s");
break;
}
}
} /* end of for(;;) statement-processing loop *//* 释放申请的空间*/
for (i = 0; i < MAX_ITEMS; i)
{
if (bind_dp->V[i] != (char *) 0)
free(bind_dp->V[i]);
free(bind_dp->I[i]); /* MAX_ITEMS were allocated. */
if (select_dp->V[i] != (char *) 0)
free(select_dp->V[i]);
free(select_dp->I[i]); /* MAX_ITEMS were allocated. */
}SQLSQLDAFree(SQL_SINGLE_RCTX, bind_dp);
SQLSQLDAFree(SQL_SINGLE_RCTX, select_dp);EXEC SQL WHENEVER SQLERROR CONTINUE;
/* 关闭游标*/
EXEC SQL CLOSE C;EXEC SQL COMMIT WORK RELEASE;
puts("nHave a good day!n");EXEC SQL WHENEVER SQLERROR DO sql_error();
return;
}/*连接数据库函数*/
oracle_connect()
{
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR username[128];
VARCHAR passWord[32];
EXEC SQL END DECLARE SECTION;
/提示用户输入用户名*/
printf("nusername: ");
fgets((char *) username.arr, sizeof username.arr, stdin);
fflush(stdin);
username.arr[strlen((char *) username.arr)-1] = "";
username.len = strlen((char *) username.arr);
/*提示用户输入口令*/
printf("password: ");
fgets((char *) password.arr, sizeof password.arr, stdin);
fflush(stdin);
password.arr[strlen((char *) password.arr) - 1] = "";
password.len = strlen((char *) password.arr);
EXEC SQL WHENEVER SQLERROR GOTO connect_error;
/*连接数据库*/
EXEC SQL CONNECT :username IDENTIFIED BY :password;
printf("nConnected to ORACLE as user %s.n", username.arr);
return 0;
/*连接错误处理*/
connect_error:
fprintf(stderr, "Cannot connect to ORACLE as user %sn",
username.arr);
return -1;
}
/*为SQLDA分配空间*/
alloc_descriptors(size, max_vname_len, max_iname_len)
推荐阅读
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门
- 小米MIX2黑色陶瓷版上手怎么样?小米黑色陶瓷版多少钱?
- 小米全陶瓷尊享版有哪些颜色?小米全陶瓷尊享版哪个颜色更好看?
- K700新版软件R2AY004试用手记
- 小米Note3吴亦凡限量版什么时候发布?
- ESQL编程使用说明
