我想实现一个功能 统计一张表字段的个数,实际正确的结果应该是2
我使用两种方法都不行 非常郁闷
代码如下
方法一:用静态SQL
EXEC SQL BEGIN DECLARE SECTION;
char * wx_Name="BUAA";
int sum=10;
short sumind=-1;
char tabname[25],selectsql[100];
char tab[25]="BUAA_NLSDE";
EXEC SQL END DECLARE SECTION;
strcpy(tabname,"BUAA_NLSDE");
strcat(tabname,"\0");
cout<<strcmp(tabname,tab)<<endl;
EXEC SQL SELECT COUNT(*) INTO :sum:sumind FROM SYS.ALL_TAB_COLUMNS WHERE OWNER='CH' AND TABLE_NAME=:tabname;
if(sqlca.sqlcode!=0)
{
cout<<sqlca.sqlerrm.sqlerrml<<"-"<<sqlca.sqlerrm.sqlerrmc<<endl;
}
cout<<"sum="<<sum<<endl;
cout<<"sumind="<<sumind<<endl;
用proc 解析后的SQL语句是
sqlstm.stmt = "select count(*)  into :b0:b1  from SYS.ALL_TAB_COLUMNS w\
here (OWNER='BDDB' and TABLE_NAME=:b2)";
sqlstm.sqhstv[1] = (         void  *)tabname;
运行结果是
0
sum=0
sumind=0
没有显示出错提示,但sum被重新被写0而不是原来的10 提示变量sumind为0 说明结果被正确写入
但如果把表名写死 即使用tab 而不是tabname
EXEC SQL SELECT COUNT(*) INTO :sum:sumind FROM SYS.ALL_TAB_COLUMNS WHERE OWNER='CH' AND TABLE_NAME=:tab;
结果却是正确的 sum=2 太FT 了!!!!
而用strcmp比较结果显示tab,tabname是相等的 strcmp 结果为0方法二:使用游标:我严格按书上例子写的
strcpy(tabname,"BUAA");
strcat(tabname,"_");
strcat(tabname,"NLSDE");
strcat(tabname,"\0");strcpy(selectsql,"select count(*) into :sum from SYS.ALL_TAB_COLUMNS where owner='CH' and TABLE_NAME='");
strcat(selectsql,tabname);
strcat(selectsql,"'");
    EXEC SQL PREPARE S FROM :selectsql;
EXEC SQL DECLARE C CURSOR FOR S;
EXEC SQL OPEN C; EXEC SQL FETCH C into :sum;
if(sqlca.sqlcode!=0)
{
cout<<"Error in EXEC SQL FETCH C "<<endl;
cout<<sqlca.sqlerrm.sqlerrml<<"-"<<sqlca.sqlerrm.sqlerrmc<<endl;
} cout<<"sum="<<sum<<endl;
EXEC SQL CLOSE C;
EXEC SQL COMMIT;结果却是
Error in EXEC SQL FETCH C 
33-ORA-01002: fetch out of sequence
我还没搞明白fetch out of sequence错误的原因
官方手册上的说明好像都不适用我这个例子
最郁闷的是方法一为什么不行!
问了周围几个师兄 都没搞出来 项目时间紧 请大家帮帮忙吧!多谢了!!!