在pro*C程序中,为什么在子进程中没有执行CLOSE CURSOR



总之。。。

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"声明游标后的语句。

相关内容

  • 没有找到相关文章