proC中的游标

Jermaine 2008-11-17 09:18:52

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;

}


这两段代码非常非常相似,但下面的正常,而上面的代码不能输出任何结果,不知道是什么原因,两段代码运行没有出现错误,只是前面那段代码没有结果,请大牛不吝赐教。。。
...全文
218 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jermaine 2008-11-18
  • 打赏
  • 举报
回复
其实20应该足够了,仅仅对列名和类型来说,不会超过20的,不过还是照您的方法改了,但没有效果。
Jermaine 2008-11-18
  • 打赏
  • 举报
回复
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'做不到这点,另外,就算让这句取代原来程序中的句子,也一样无法读出数据。
wiler 2008-11-18
  • 打赏
  • 举报
回复
mystr colname[20];
mystr coltype[20];

这里的数组变量定义得太短了
可改为:

mystr colname[200];
mystr coltype[200];
Jermaine 2008-11-18
  • 打赏
  • 举报
回复
回楼上大牛,我是XP+oracle9i...

可能确实和编译器有关。。
wiler 2008-11-18
  • 打赏
  • 举报
回复
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变量没有
申请内存,不知道对不对?请知道的朋友们指教
wiler 2008-11-18
  • 打赏
  • 举报
回复
我测试过这段代码
我的环境是aix + oracle9i
把mystr改为char就可以了
用mystr就是不行
lz 的环境是?
Jermaine 2008-11-18
  • 打赏
  • 举报
回复
非常感谢wiler,按照你的方法改动后确实可以读出了,但我还是不太明白为什么第二段代码可以读出数据。
Jermaine 2008-11-18
  • 打赏
  • 举报
回复
我给出了两段代码,第一段不行,第二段可以,如果是typedef的问题,那么第二段应该也不行的吧。。。
wiler 2008-11-18
  • 打赏
  • 举报
回复
问题出在这个定义上面:
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;
xudaqing2008 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 BlueskyWide 的回复:]

即:CNAME,COLTYPE 改为:EMPNO,ENAME
[/Quote]

就是就是,两个检索sql要完全一样才有可比性!
BlueskyWide 2008-11-17
  • 打赏
  • 举报
回复
EXEC SQL DECLARE col_cursor CURSOR FOR SELECT CNAME,COLTYPE FROM COL WHERE TNAME='EMP' and cname='EMPNO';
BlueskyWide 2008-11-17
  • 打赏
  • 举报
回复

即:CNAME,COLTYPE 改为:EMPNO,ENAME
BlueskyWide 2008-11-17
  • 打赏
  • 举报
回复
--第一段中:
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
mantisXF 2008-11-17
  • 打赏
  • 举报
回复
INDICATOR:ind_mgr 是什么意思?[Quote=引用楼主 Jermaine 的帖子:]
C/C++ code
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();



[/Quote]
Jermaine 2008-11-17
  • 打赏
  • 举报
回复
说明一下,在文件开头有一个类型定义

typedef char mystr

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧