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;
}
这两段代码非常非常相似,但下面的正常,而上面的代码不能输出任何结果,不知道是什么原因,两段代码运行没有出现错误,只是前面那段代码没有结果,请大牛不吝赐教
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
即:CNAME,COLTYPE 改为:EMPNO,ENAME
就是就是,两个检索sql要完全一样才有可比性!
mystr coltype[20]; 这里的数组变量定义得太短了
可改为:mystr colname[200];
mystr coltype[200];
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;
我的环境是aix + oracle9i
把mystr改为char就可以了
用mystr就是不行
lz 的环境是?
改为
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变量没有
申请内存,不知道对不对?请知道的朋友们指教