总之。。。
int main() {
pid_t childPid;
EXEC SQL CONNECT :username IDENTIFIED BY :password;
for (;;)
{
childPid = fork();
if(childPid > 0)
{ // parent process
...
...
...
}
else if(childPid == 0)
{ // chiled process
EXEC SQL DECLARE c1 CURSOR FOR
SELECT empno, ename, sal FROM emp;
for (;;)
{
EXEC SQL OPEN c1;
EXEC SQL FETCH c1 INTO :emp_rec;
if(sqlca.sqlcode == 1403)
{
EXEC SQL CLOSE c1;
EXEC SQL COMMIT WORK RELEASE;
break;
}
...
...
//A function that sends results to the Client program.
SendPacketTOClient(fd,size);
}
EXEC SQL COMMIT WORK;
exit(0);
}
else { // fork Fail
perror("fork Fail! n");
return -1;
}
sleep(60);
}
retun 0;
}
如上所述,DB CONNECT在父进程中执行,fork每分钟执行一次,子进程在查询后以退出(0(结束(DECLARE->OPEN>FETCH->CLOSE(。没有问题,因为它一直被处理到FETCH。但如果CLOSE不能正常工作,则稍后会出现ORA-01000:最大打开响应错误。当我实际检查时,子进程已经创建,当它在完成工作后终止时,它并没有关闭。
在Serch之后,我发现这是一个问题,因为Servie进程就是其中之一,所以我通过分支父进程和子进程DB连接来解决它。
我解决了,但我想知道原理,所以我留下了一个问题。我可以知道为什么执行DECLARE、OPEN和FETCH,而不执行COLSE吗?
谢谢。
添加"EXEC SQL FREE:c1"陈述这将释放打开的游标。还加上";EXEC SQL分配:c1"声明游标后的语句。