(strncmp(dyn_statement, "select", 6) != 0))
{
select_dp->F = 0;
return;
}/* 如果是SELECT语句,则通过DESCRIBE函数返回列名、数据类型、长度和是否为NULL标志*/
select_dp->N = MAX_ITEMS;
EXEC SQL DESCRIBE SELECT LIST FOR S INTO select_dp;
/* 如果F小于0 。则表示比预定的列数要多 。*/
if (select_dp->F < 0)
{
printf
("nToo many select-list items (%d), maximum is %dn",
-(select_dp->F), MAX_ITEMS);
return;
}
/* 设置最大列数为实际列数*/
select_dp->N = select_dp->F;
/* 为每列分配空间 。
SQLNumberPrecV6() 函数的作用是从select_dp->L[i]获得精度和长度 。
SQLColumnNullCheck() 函数的作用是检查该列是否为NULL 。*/
printf ("n");
for (i = 0; i < select_dp->F; i)
{
/* 关闭最高位*/
SQLColumnNullCheck (&(select_dp->T[i]),
&(select_dp->T[i]), &null_ok);switch (select_dp->T[i])
{
case 1 : /* CHAR */
break;
case 2 : /* NUMBER ,获得精度和范围*/
SQLNumberPrecV6 (SQL_SINGLE_RCTX, &(select_dp->L[i]), &precision,
&scale);
/* 如果精度为0,则设置为最大值40 */
if (precision == 0) precision = 40;
if (scale > 0)
select_dp->L[i] = sizeof(float);
else
select_dp->L[i] = sizeof(int);
break;case 8 : /* LONG*/
select_dp->L[i] = 240;
break;case 11 : /* ROWID datatype */
select_dp->L[i] = 18;
break;case 12 : /* DATE datatype */
select_dp->L[i] = 9;
break;
case 23 : /* RAW datatype */
break;case 24 : /* LONG RAW datatype */
select_dp->L[i] = 240;
break;
}
/* 申请空间给SQLDA来存放数据*/
if (select_dp->T[i] != 2)
select_dp->V[i] = (char *) realloc(select_dp->V[i],
select_dp->L[i]1);
else
select_dp->V[i] = (char *) realloc(select_dp->V[i],
select_dp->L[i]);/* 输出列名*/
if (select_dp->T[i] == 2)
if (scale > 0)
printf ("%.*s ",select_dp->L[i] 3, select_dp->S[i]);
else
printf ("%.*s ", select_dp->L[i], select_dp->S[i]);
else
printf ("%-.*s ", select_dp->L[i], select_dp->S[i]);/* 除了LONG RAW和NUMBER,其他数据类型转换为字符型数据类型*/
if (select_dp->T[i] != 24 && select_dp->T[i] != 2)
select_dp->T[i] = 1;/* 将 NUMBER数据类型转换为浮点型数据类型或int数据类型*/
if (select_dp->T[i] == 2)
if (scale > 0)
select_dp->T[i] = 4; /* float */
else
select_dp->T[i] = 3; /* int */
}
printf ("nn");/* 取出每一行数据*/
EXEC SQL WHENEVER NOT FOUND GOTO end_select_loop;
for (;;)
{
EXEC SQL FETCH C USING DESCRIPTOR select_dp;/*输出列数据 。除了float和int数据类型,其他数据类型都被转为字符型*/
for (i = 0; i < select_dp->F; i)
{
if (*select_dp->I[i] < 0)
if (select_dp->T[i] == 4)
printf ("%-*c ",(int)select_dp->L[i] 3, " ");
else
printf ("%-*c ",(int)select_dp->L[i], " ");
else
if (select_dp->T[i] == 3) /* int datatype */
printf ("%*d ", (int)select_dp->L[i],
*(int *)select_dp->V[i]);
else if (select_dp->T[i] == 4)/* float datatype*/
printf ("%*.2f ", (int)select_dp->L[i],
*(float *)select_dp->V[i]);
else /* character string */
printf ("%-*s ",
(int)select_dp->L[i], select_dp->V[i]);
}
printf ("n");
}
end_select_loop:
return;
}help()
{
puts("nnEnter a SQL statement or a PL/SQL block");
puts("at the SQL> prompt.");
puts("Statements can be continued over several");
puts("lines, except within string literals.");
puts("Terminate a SQL statement with a semicolon.");
puts("Terminate a PL/SQL block");
puts("(which can contain embedded semicolons)");
puts("with a slash (/).");
puts("Typing "exit" (no semicolon needed)");
puts("exits the program.");
puts("You typed "?" or "help"");
puts(" to get this message.nn");
}
sql_error()
{
int i;/* ORACLE error handler */
printf ("nn%.70sn",sqlca.sqlerrm.sqlerrmc);
if (parse_flag)
printf("Parse error at character offset %d.n",
sqlca.sqlerrd[4]);EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK;
推荐阅读
- kha苹果是什么版本
- 荒野乱斗九游版激活码在哪
- HTC U11国行版系统更新了什么?HTC U11国行版系统更新内容
- 小米MIX2黑色陶瓷版和全陶瓷尊享版哪个好?哪个更划算?
- 增补版 SCO UNIX快速入门
- 小米MIX2黑色陶瓷版上手怎么样?小米黑色陶瓷版多少钱?
- 小米全陶瓷尊享版有哪些颜色?小米全陶瓷尊享版哪个颜色更好看?
- K700新版软件R2AY004试用手记
- 小米Note3吴亦凡限量版什么时候发布?
- ESQL编程使用说明
