EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE mystr IS STRING(20);

mystr username[20];
mystr password[20];

mystr colname[20];
mystr coltype[20];
EXEC SQL END DECLARE SECTION;exec sql include sqlca;int main(){
int i = 0;
EXEC SQL WHENEVER SQLERROR DO error_proc();



strcpy(username,"SCOTT");
strcpy(password,"scott");

if(connect() != 0){
exit(-1);//若数据库连接失败,则直接退出程序
}


EXEC SQL DECLARE col_cursor CURSOR FOR SELECT CNAME,COLTYPE FROM COL WHERE TNAME='EMP';


EXEC SQL OPEN col_cursor;

for(;;){
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL FETCH col_cursor INTO :colname,:coltype;
printf("%s     %s",colname,coltype);
}
EXEC SQL WHENEVER NOT FOUND DO continue;
EXEC SQL CLOSE col_cursor;
}
上面这段代码运行会导致没有结果输出,而实际上如果在SQLPLUS中输入SELECT CNAME,COLTYPE FROM COL WHERE TNAME='EMP';是有结果的。而下面这段代码与上面的代码非常类似,但却是有结果的。EXEC SQL BEGIN DECLARE SECTION;
EXEC SQL TYPE mystr IS STRING(20);

mystr username[20];
mystr password[20]; int empno;
mystr ename[20];
mystr job[20];
int mgr;
mystr hireDate[20];
float sal;
float comm;
int deptno;
short ind_comm;
short ind_mgr;

EXEC SQL END DECLARE SECTION;exec sql include sqlca;int main(){
int i = 0;
EXEC SQL WHENEVER SQLERROR DO error_proc();



strcpy(username,"SCOTT");
strcpy(password,"scott");

if(connect() != 0){
exit(-1);//若数据库连接失败,则直接退出程序
}

EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM EMP;

EXEC SQL OPEN emp_cursor;

for(;;){
EXEC SQL WHENEVER NOT FOUND DO break;
EXEC SQL FETCH emp_cursor INTO :empno,:ename,:job,:mgr INDICATOR:ind_mgr,:hireDate,:sal,:comm INDICATOR :ind_comm,:deptno;
if(ind_comm < 0){
if(ind_mgr < 0){
printf("%-11d%-11s%-11s%-11s%-11s%-11.2f%-11s%-11d\n",empno,ename,job,"NULL",hireDate,sal,"NULL",deptno);
}
else{
printf("%-11d%-11s%-11s%-11d%-11s%-11.2f%-11s%-11d\n",empno,ename,job,mgr,hireDate,sal,"NULL",deptno);
}
}
else{
if(ind_mgr < 0){
printf("%-11d%-11s%-11s%-11s%-11s%-11.2f%-11.2f%-11d\n",empno,ename,job,"NULL",hireDate,sal,comm,deptno);
}
else{
printf("%-11d%-11s%-11s%-11d%-11s%-11.2f%-11.2f%-11d\n",empno,ename,job,mgr,hireDate,sal,comm,deptno);
}

}
}
EXEC SQL WHENEVER NOT FOUND DO continue;
EXEC SQL CLOSE emp_cursor;

}
这两段代码非常非常相似,但下面的正常,而上面的代码不能输出任何结果,不知道是什么原因,两段代码运行没有出现错误,只是前面那段代码没有结果,请大牛不吝赐教

解决方案 »

  1.   

    说明一下,在文件开头有一个类型定义typedef char mystr
      

  2.   

    INDICATOR:ind_mgr 是什么意思?
      

  3.   

    --第一段中:
                exit(-1);//若数据库连接失败,则直接退出程序
            }
            
            
            EXEC SQL DECLARE col_cursor CURSOR FOR SELECT CNAME,COLTYPE FROM COL WHERE TNAME='EMP';
            
            
            EXEC SQL OPEN col_cursor;--改为:            exit(-1);//若数据库连接失败,则直接退出程序
            }
            
            
            EXEC SQL DECLARE col_cursor CURSOR FOR SELECT EMPNO,ENAME FROM COL WHERE TNAME='EMP';
            
            
            EXEC SQL OPEN col_cursor;
    即:CNAME,COLTYPE 改为:EMPNO,ENAME
      

  4.   


    即:CNAME,COLTYPE 改为:EMPNO,ENAME
      

  5.   

    EXEC SQL DECLARE col_cursor CURSOR FOR SELECT CNAME,COLTYPE FROM COL WHERE TNAME='EMP' and cname='EMPNO';
      

  6.   


    就是就是,两个检索sql要完全一样才有可比性!
      

  7.   

    mystr colname[20];
    mystr coltype[20];  这里的数组变量定义得太短了
    可改为:mystr colname[200];
    mystr coltype[200];  
      

  8.   

    SELECT EMPNO,ENAME FROM COL WHERE TNAME='EMP';这个语句就是错的,col表中没有这两列还有,我的目的是希望能得到EMP表的所有字段名和他们的类型,而EXEC SQL DECLARE col_cursor CURSOR FOR SELECT CNAME,COLTYPE FROM COL WHERE TNAME='EMP' and cname='EMPNO'做不到这点,另外,就算让这句取代原来程序中的句子,也一样无法读出数据。
      

  9.   

    问题出在这个定义上面:
    typedef char mystr在proc解析时由于不认识这个mystr数据类型从而被解析错
    把这个定义 typedef char mystr 去掉,直接使用 char 就可以了,所以
    EXEC SQL BEGIN DECLARE SECTION;
        EXEC SQL TYPE mystr IS STRING(20);
        
        mystr username[20];
        mystr password[20];
        
        mystr colname[20];
        mystr coltype[20];            
    EXEC SQL END DECLARE SECTION;
    应改为:
    EXEC SQL BEGIN DECLARE SECTION;
        EXEC SQL TYPE char IS STRING(20);
        
        char username[20];
        char password[20];
        
        char colname[20];
        char coltype[20];            
    EXEC SQL END DECLARE SECTION;
      

  10.   

    我给出了两段代码,第一段不行,第二段可以,如果是typedef的问题,那么第二段应该也不行的吧
      

  11.   

    非常感谢wiler,按照你的方法改动后确实可以读出了,但我还是不太明白为什么第二段代码可以读出数据。
      

  12.   

    我测试过这段代码
    我的环境是aix + oracle9i
    把mystr改为char就可以了
    用mystr就是不行
    lz 的环境是?
      

  13.   

    typedef char mystr;
    改为
    typedef char mystr[20];而
    EXEC SQL BEGIN DECLARE SECTION; 
        EXEC SQL TYPE mystr IS STRING(20); 
        
        mystr username[20]; 
        mystr password[20]; 
        
        mystr colname[20]; 
        mystr coltype[20];            
    EXEC SQL END DECLARE SECTION; 
    改为:
    EXEC SQL BEGIN DECLARE SECTION; 
        EXEC SQL TYPE mystr IS STRING(20); 
        
        mystr username; 
        mystr password; 
        
        mystr colname; 
        mystr coltype;            
    EXEC SQL END DECLARE SECTION;
    程序也是可以正常的那为什么第二段代码行而第一段代码不行呢?我猜可能和c编译器有关,可能c编译器认为colname变量没有
    申请内存,不知道对不对?请知道的朋友们指教
      

  14.   

    回楼上大牛,我是XP+oracle9i...可能确实和编译器有关。。