PHP,Oracle和ODBC:如何检查结果集是否为空?

时间:2014-03-10 08:44:21

标签: php sql oracle odbc

亲爱的书呆子和论坛成员,

我在带有ODBC驱动程序的Oracle数据库上遇到了一个很好的问题。

首先是代码:

$ora_conn = odbc_connect($ora_dsn, $ora_user, $ora_pass, SQL_CUR_USE_ODBC);
$ora_data = odbc_exec($ora_conn,$sql);

//echo "test: ".odbc_num_rows( $ora_data );
//exit;

if(odbc_num_rows( $ora_data ) > 0){
    // do something in case no result came back
}

if($ora_data){
    // do something in case result came back
}

如果我取消测试,我总会回来-1!无论语句是否产生0,1或5行......

所以使用这段代码,如果没有结果,1个结果或更多结果会回来,我永远无法获得信息。

您对如何解决此问题有任何想法吗?

非常感谢您的帮助!

致敬,Ingmar

3 个答案:

答案 0 :(得分:2)

odbc_num_rows似乎仅对INSERT,UPDATE和DELETE查询可靠。

manual说:

  

使用odbc_num_rows()确定SELECT之后可用的行数将返回-1并包含许多驱动程序。

解决此问题的一种方法是在SQL中执行COUNT(*)。有关示例,请参阅here

答案 1 :(得分:1)

if(odbc_num_rows( $ora_data ) == 0){
    // do something in case no result came back
}

if(!$ora_data){
    // do something in case result came back
}

答案 2 :(得分:0)

我解决了,谢谢你的答案......

我的解决方案是:代码优先

$sql =  "SELECT GUID FROM SMSITEACCESS WHERE PROJECTID = 901981 AND SID = " . $guid;
$ora_data = odbc_exec($ora_conn,$sql);

$arr = @odbc_fetch_array($ora_data);

if($arr['GUID'] == ""){
    $dbh_insert = new PDO($dsn,$dbuser,$dbpass);
    $dbh_insert->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $sql_insert = "INSERT INTO SMSITEACCESS (SID, CREATED, CREATEUSER, PROJECTID) VALUES ('".$guid."', SYSDATE, '".$userid."', '901981')";
    $res_insert = $dbh_insert -> prepare($sql_insert);
    $res_insert -> execute();
    $sql_insert=null;
    $res_insert=null;
    $dbh_insert=null;
}

odbc_free_result($ora_data);

我首先添加了一个包含文件。如果要处理的每个表都包含在一个数据集的最后一个,则此脚本逐个检查。如果其中任何一个没有,则将其创建为空。

通过这种解决方法,我不再需要检查数据是否会回来......

这可能要容易得多,但ODBC驱动程序接缝在这种情况下会出错。

Thnx快速回复,祝你有个美好的一天。

英格玛