Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用php oci从oracle存储过程捕获oracle异常_Php_Oracle_Exception_Stored Procedures - Fatal编程技术网

无法使用php oci从oracle存储过程捕获oracle异常

无法使用php oci从oracle存储过程捕获oracle异常,php,oracle,exception,stored-procedures,Php,Oracle,Exception,Stored Procedures,有人知道如何在php中捕获oracle异常吗? 我有一个存储过程,当发生某些事情时会引发异常,我希望将消息直接传递给浏览器。我尝试使用try-catch和oci\u-error,但仍然无法捕获异常。我想从oracle存储过程中捕获类似的内容 RAISE_APPLICATION_ERROR(-20101, 'SOME EXCEPTION'); public function oci_procedure_call($package_name, $proc_name, $param) {

有人知道如何在php中捕获oracle异常吗? 我有一个存储过程,当发生某些事情时会引发异常,我希望将消息直接传递给浏览器。我尝试使用try-catch和oci\u-error,但仍然无法捕获异常。我想从oracle存储过程中捕获类似的内容

RAISE_APPLICATION_ERROR(-20101, 'SOME EXCEPTION');

public function oci_procedure_call($package_name, $proc_name, $param)
{
    $sql = "begin $package_name.$proc_name(";

    foreach ($param as $p) {
        $sql .= $p['name'] . ',';
    }

    $sql = trim($sql, ',') . '); end;';

    $stmt = oci_parse($this->db->conn_id, $sql);

    foreach ($param as $p) {
        oci_bind_by_name($stmt, $p['name'], $p['value'], $p['length'], $p['type']);
    }

    try {
        $r = oci_execute($stmt);
    } catch (Exception $e) {
        log_message('info', print_r($e, true));
    }

    if (!$r) {
        $e = oci_error($this->db->conn_id);
        return $e['message'];
    } else {
        return true;
    }
}
并将“某些异常”发送到浏览器。

在php代码中,我使用了codeigniter,但我无法使用它提供的驱动程序调用该过程,因此我创建了自己的函数。它与codeigniter提供的非常相似,但我不知道为什么我的工作。下面是调用存储过程的函数

RAISE_APPLICATION_ERROR(-20101, 'SOME EXCEPTION');

public function oci_procedure_call($package_name, $proc_name, $param)
{
    $sql = "begin $package_name.$proc_name(";

    foreach ($param as $p) {
        $sql .= $p['name'] . ',';
    }

    $sql = trim($sql, ',') . '); end;';

    $stmt = oci_parse($this->db->conn_id, $sql);

    foreach ($param as $p) {
        oci_bind_by_name($stmt, $p['name'], $p['value'], $p['length'], $p['type']);
    }

    try {
        $r = oci_execute($stmt);
    } catch (Exception $e) {
        log_message('info', print_r($e, true));
    }

    if (!$r) {
        $e = oci_error($this->db->conn_id);
        return $e['message'];
    } else {
        return true;
    }
}

为了进一步参考,您是否介意展示一些php代码?另外,欢迎来到Stackoverflow。谢谢:)。我已经添加了我的php代码。希望有帮助。@Mark你能将你的代码改成这样吗:(注意块注释的部分和它们后面的部分)然后再试一次?@Passerby我尝试过使用你在链接中提供的代码,但它无法通过这一行
$sql.=infrade(,”,array_column($param,“name”)。它就停在那里。我尝试过用我的原始代码更改这一行,这很好,可以遍历代码的其余部分,但没有区别。@路人对不起,这是我的错误,我的php版本是5.3.8。我再试一次。