Perl Sybase::CTlib的ct_results()和ct_cmd_drop()错误

Perl Sybase::CTlib的ct_results()和ct_cmd_drop()错误,perl,sybase,dbi,Perl,Sybase,Dbi,我正在使用来查询Sybase服务器。但是,当我执行以下操作时: while( $dbr->ct_results($restype) == CS_SUCCEED ) { if( $restype == CS_CMD_FAIL ) { warn "Update Check Failed..."; next; } next unless $dbr->ct_fetchable($restype); $ts = $dbr->ct_fetch

我正在使用来查询Sybase服务器。但是,当我执行以下操作时:

while( $dbr->ct_results($restype) == CS_SUCCEED ) {
    if( $restype == CS_CMD_FAIL ) {
    warn "Update Check Failed...";
    next;
    }
    next unless $dbr->ct_fetchable($restype);
    $ts = $dbr->ct_fetch;
}
我的查询只返回一个值。这就是为什么我要读入一个变量

我发现了一些错误:

打开客户端消息:
消息编号:层=(1)来源=(1)严重性=(1)编号=(163)
消息字符串:ct_results():用户api层:外部错误:在完成所有可获取结果的处理之前,无法调用此例程

打开客户端消息:
消息编号:层=(1)源=(1)严重性=(1)编号=(159)
消息字符串:ct_cmd_drop():用户api层:外部错误:只有在命令结构空闲时才能调用此例程


怎么了?

再次调用
ct\u fetch
时会发生什么?我不使用Sybase,但从查看文档来看,模块似乎希望您进行额外调用,此时它意识到它已经获取了所有数据,并关闭了内部跟踪的任何内容

while( $dbr->ct_results($restype) == CS_SUCCEED ) {
    if( $restype == CS_CMD_FAIL ) {
        warn "Update Check Failed...";
        next;
        }
    next unless $dbr->ct_fetchable($restype);
    $ts = $dbr->ct_fetch;
    1 while(my @data = $dbh->ct_fetch); # discard the rest
}

即使SQL返回一行,也不能像代码那样只调用一次ct_fetch。必须在循环中调用它,直到为false

似乎是最周全的解决方案(
1 while(my@data=$dbh->ct_fetch);
,所以我不会费心提供替代方案。我将提供的是说明代码失败原因的文档

此行为记录在SyBooks docs for ct_fetch中:

如果应用程序不取消结果集,则只要ct\U fetch继续指示行可用,它就必须通过调用ct\U fetch来完全处理结果集

最简单的方法是在循环中,当ct\U fetch无法返回CS\U SUCCESS或CS\U ROW\U FAIL时终止。循环终止后,应用程序可以对ct\U fetch的最终返回代码使用switch type语句来找出终止的原因

如果结果集包含零行,则应用程序的第一个ct\u fetch调用将返回CS\u END\u数据

注意:即使结果集只包含一行,应用程序也必须在循环中调用ct\u fetch。应用程序必须调用ct\u fetch,直到返回CS\u success或CS\u row\u FAIL失败为止

我对原因的猜测是,CTLib内部有一些“结果集完成”标志设置为false,在ct_fetch发现结果集中没有更多行之前,它不会被重新设置为true(基本上,brian d foy所说);当标志为false时,CTLib代码的其余部分将检查该标志并将错误与错误163一起清除


如果不查看实际的CTLib源代码,我无法100%确认,我无法在文档中找到确切原因

请发布您正在运行的特定查询,好吗?