int size;
int max_vname_len;
int max_iname_len;
{
int i;
/*SQLSQLDAAlloc的第一个参数是SQL语句的最大列数或输入宿主变量的最大个数 。
*第二个参数,是指列名的最大长度,或参数名的最大长度 。
*第三个参数,是指指示符变量名的最大长度 。*/
/*给SQLDA分配空间,下面这个SQLDA用于输入参数*/
if ((bind_dp =
SQLSQLDAAlloc(SQL_SINGLE_RCTX, size,
max_vname_len, max_iname_len)) == (SQLDA *) 0)
{
fprintf(stderr, "Cannot allocate memory for bind descriptor.");
return -1; /* Have to exit in this case. */
}
/*给SQLDA分配空间,下面这个SQLDA用于动态查询*/
if ((select_dp =
SQLSQLDAAlloc (SQL_SINGLE_RCTX, size,
max_vname_len, max_iname_len)) == (SQLDA *) 0)
{
fprintf(stderr,"Cannot allocate memory for select descriptor.");
return -1;
}
/*设置最大的列数,或最大的变量数*/
select_dp->N = MAX_ITEMS;/* 给存放指示符变量值和存放数据的变量申请空间 。*/
for (i = 0; i < MAX_ITEMS; i) {
bind_dp->I[i] = (short *) malloc(sizeof (short));
select_dp->I[i] = (short *) malloc(sizeof(short));
bind_dp->V[i] = (char *) malloc(1);
select_dp->V[i] = (char *) malloc(1);
}
return 0;
}
/*获得SQL语句,可略看*/
get_dyn_statement()
{
char *cp, linebuf[256];
int iter, plsql;
int help();
for (plsql = 0, iter = 1; ;)
{
if (iter == 1)
{
printf("nSQL> ");
dyn_statement[0] = "";
}
fgets(linebuf, sizeof linebuf, stdin);
fflush(stdin);cp = strrchr(linebuf, "n");
if (cp && cp != linebuf)
*cp = " ";
else if (cp == linebuf)
continue;
if ((strncmp(linebuf, "EXIT", 4) == 0) ||
(strncmp(linebuf, "exit", 4) == 0))
{
return -1;
}
else if (linebuf[0] == "?" ||
(strncmp(linebuf, "HELP", 4) == 0) ||
(strncmp(linebuf, "help", 4) == 0))
{
help();
iter = 1;
continue;
}
if (strstr(linebuf, "BEGIN") ||
(strstr(linebuf, "begin")))
{
plsql = 1;
}
strcat(dyn_statement, linebuf);
if ((plsql && (cp = strrchr(dyn_statement, "/"))) ||
(!plsql && (cp = strrchr(dyn_statement, ";"))))
{
*cp = "";
break;
}
else
{
iter;
printf("= ", iter);
}
}
return 0;
}
/*设置宿主变量的信息*/
set_bind_variables()
{
int i, n;
char bind_var[64];/* 通过DESCRIBE语句,将处理语句的参数名、数据类型等信息存放在bind_dp中*/
EXEC SQL WHENEVER SQLERROR DO sql_error();
bind_dp->N = MAX_ITEMS; /* Init. count of array elements. */
EXEC SQL DESCRIBE BIND VARIABLES FOR S INTO bind_dp;
/* F小于0,表示SQLSQLDAAlloc()分配的空间不够,即实际参数的个数超出预算的最大值. */
if (bind_dp->F < 0)
{
printf("nToo many bind variables (%d), maximum is %d.n",
-bind_dp->F, MAX_ITEMS);
return;
}
/* 将N(最大值)设置为实际的参数个数*/
bind_dp->N = bind_dp->F;
/* 提示用户输入参数值,并设置SQLDA的其他相关值,如:长度等 。*/
for (i = 0; i < bind_dp->F; i)
{
printf ("nEnter value for bind variable %.*s: ",
(int)bind_dp->C[i], bind_dp->S[i]);
fgets(bind_var, sizeof bind_var, stdin);/* 获得长度,去掉NULL结束符 */
n = strlen(bind_var) - 1;
/*设置参数长度 */
bind_dp->L[i] = n;
/* 分配存放参数数据的内存空间 */
bind_dp->V[i] = (char *) realloc(bind_dp->V[i], (bind_dp->L[i]1));
/* 将数据放在这个内存空间中 */
strncpy(bind_dp->V[i], bind_var, n);
/* 设置指示符变量的值*/
if ((strncmp(bind_dp->V[i], "NULL", 4) == 0) ||
(strncmp(bind_dp->V[i], "null", 4) == 0))
*bind_dp->I[i] = -1;
else
*bind_dp->I[i] = 0;
/* 设置数据类型为CHAR,ORACLE会根据列的数据类型自动转换 */
bind_dp->T[i] = 1;
}
}
/*处理语句*/
process_select_list()
{
int i, null_ok, precision, scale;
/*如果不是查询语句,则设置F(即返回的列数)为0*/
if ((strncmp(dyn_statement, "SELECT", 6) != 0) &&
推荐阅读
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门
- 小米MIX2黑色陶瓷版上手怎么样?小米黑色陶瓷版多少钱?
- 小米全陶瓷尊享版有哪些颜色?小米全陶瓷尊享版哪个颜色更好看?
- K700新版软件R2AY004试用手记
- 小米Note3吴亦凡限量版什么时候发布?
- ESQL编程使用说明
