亲爱的书呆子和论坛成员,
我在带有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
答案 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快速回复,祝你有个美好的一天。
英格玛