【问题标题】:ORACLE + PHP oci_execute() got freeze and not return anythingORACLE + PHP oci_execute() 冻结并且不返回任何内容
【发布时间】:2019-03-27 17:48:23
【问题描述】:

我正在尝试使用以下代码执行 oracle SQL 语句。

$ofe_id = '123';    
$stmt = oci_parse($this->db->conn_id, "DECLARE
l_retval     VARCHAR2(255);
l_message    VARCHAR2(2000);
BEGIN
l_retval := offerte.fill_temp_fields(:ofe_id,l_message);
END;") or die("Cannot parse query");

oci_bind_by_name($stmt, ':ofe_id', $ofe_id);
//        $err = oci_error($stmt); //It return 'false';
$respose = oci_execute($stmt, OCI_DEFAULT);

我在 Ubuntu 14.0x 中使用 PHP 5.6。 当我尝试执行上述语句时。它冻结并且什么也不返回。

当我尝试调试代码时,我发现它一直执行到 oci_execute() ,之后它不会执行下一个代码。我一直等到 30 分钟,但似乎没有返回任何响应。

【问题讨论】:

    标签: php oracle codeigniter


    【解决方案1】:

    您可能打开了另一个 Oracle 会话,并且您的表周围有一些锁。

    抱歉,我不是专家,但我曾经在 PHP-Apache 和 PHP-CLI 同时测试 Oracle 功能时遇到类似的问题,并打开了几个不同的 SQL+ 提示符(例如 SYSDBA、模式所有者和非特权用户)。提交后“freezing oci_execute”错误消失了。

    但是,您应该为变量指定正确的类型和大小:

    oci_bind_by_name($stmt, ':ofe_id', $ofe_id, -1, SQLT_INT);
                                                ^^^^^^^^^^^^
    

    PHP 和 Oracle 都在数字和数字字符串之间进行静默类型转换,但有时尾字符可能会丢失。

    【讨论】:

      【解决方案2】:

      只需使用 PHP 5.3.2 之前的 OCI_DEFAULT,改用 OCI_NO_AUTO_COMMIT...不能说这是否能解决您的所有问题,因为我现在无法重现此错误,但我几乎可以肯定这可以帮助。

      【讨论】:

      • 谢谢,但还是一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多