PHP中带有引用游标的PL/SQL存储过程

bnlyeluc  于 2023-02-18  发布在  PHP
关注(0)|答案(1)|浏览(104)

我在CodeIgniter 3中开发的一个函数遇到了一些问题。我试图用引用游标调用Oracle中的存储过程(带有一些条件和连接的SELECT),但当我执行它时,我从游标中得到了一个空数组。
我把下面的PHP代码留给你:

public function getReport($nummonth,$numyear){
    $sqlqry = "BEGIN FRGSV006_SCP60_COMPACT(:cur,:nummonth,:numyear); END;";
        
    $smt = oci_parse($this->connbi, $sqlqry);
        
    oci_bind_by_name($smt, ":nummonth", $nummonth,32);
    oci_bind_by_name($smt, ":numyear", $numyear,32);
        
    $refcur = oci_new_cursor($this->connbi);
        
    oci_bind_by_name($smt, ":cur",$refcur,-1,OCI_B_CURSOR);
        
    oci_execute($smt);
    oci_execute($refcur);
        
    oci_fetch_all($refcur, $result,null,null,OCI_FETCHSTATEMENT_BY_ROW);
        
    oci_free_statement($smt);
    oci_free_statement($refcur);
        
    return $result;
}

我已经在数据库上测试了这个程序,它是可以的。我已经在谷歌上搜索了一个解决方案,没有一个工作。
您是否知道可能发生的情况/为什么不返回数据?

chhqkbe1

chhqkbe11#

你的代码看起来不错。我假设connbi已经在成功的@oci_pconnect调用中定义了。你还应该在每一步检查错误:

$connbi = @oci_pconnect( . . . );

if (!$connbi) {
  $e = oci_error();
  trigger_error('Could not connect to database: ' . $e['message'],E_USER_ERROR);
  }

$smt = oci_parse($this->connbi, $sqlqry);

if (!$smt) {
  $e = oci_error($connbi);
  trigger_error('Could not parse statement: ' . $e['message'] . $sql,E_USER_ERROR);

}

$refcur = oci_new_cursor($this->connbi);
    
oci_bind_by_name($smt, ":cur",$refcur,-1,OCI_B_CURSOR);
    
$r = oci_execute($smt);

if (!$r) {
  $e = oci_error($smt);

  trigger_error(htmlentities('Could not execute: ' . $e['message']),E_USER_ERROR);
  }

$r = oci_execute($refcur);

if (!$r) {
  $e = oci_error($refcur);

  trigger_error(htmlentities('Could not execute: ' . $e['message']),E_USER_ERROR);
  }

同时捕获$nrows = oci_fetch_all($refcur, $result,null,null, OCI_FETCHSTATEMENT_BY_ROW);返回的行并发出调试输出,看看它是否返回了任何内容。您可能还需要设置一些PHP设置,如:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

相关问题