【问题标题】:Error inserting BLOB into Oracle将 BLOB 插入 Oracle 时出错
【发布时间】:2015-09-12 20:17:23
【问题描述】:

我正在使用这个包装器,因为 PHP 中的 Oracle PDO 是实验性的: https://github.com/yajra/pdo-via-oci8

下面是插入 BLOB 的 PHP 代码,该代码在 MySQL 中有效,但在 Oracle 中尚不可用:

public function insertPacket($nist) {
  $blob = fopen($nist->getActualFile(), 'rb');
  $sql = "INSERT INTO packets(packet) VALUES(:packet)";
  $query = $this->link->prepare($sql);
  $query->bindParam(':packet', $blob, PDO::PARAM_LOB);
  if(!$query->execute()) {      
     trigger_error(print_r($query->errorInfo(), true), E_USER_ERROR);         
  }
  return $this->link->lastInsertId();
}

在 oracle 中我得到了这个异常: 致命错误:第 156 行 C:\wamp\www\project\includes\PdoViaOci8\Statement.php 中带有消息的未捕获异常“Oci8Exception”

Oci8Exception: Error Code    : 22275
Error Message : ORA-22275: invalid LOB locator specified
Position      : 12
Statement     : INSERT INTO packets(packet) VALUES(:packet)

任何想法我做错了什么?

【问题讨论】:

    标签: php mysql oracle pdo


    【解决方案1】:

    在 Oracle 中插入带有 BLOB 列的新行时,您需要先将 BLOB 列初始化为空 BLOB,然后才能设置字节。

    我不熟悉 PHP 方面的事情,但基本上,您的插入语句必须变成这样:

    INSERT INTO packets (packet)
    VALUES (empty_blob())
    RETURNING packet INTO :packet
    

    【讨论】:

    • 我试过了,但仍然无法将 blob 放入其中。它是零字节。
    • 很抱歉,但下一步涉及对 PHP 和您正在使用的特定库的更深入了解,我没有。我只知道如何解决您的问题(无效的 LOB 定位器)中的特定错误,即您需要先创建一个空 blob,然后才能绑定到它。然后,作为最后一步,您可以将字节推入。抱歉,我对最后一部分无能为力。但希望您现在更接近解决方案。
    【解决方案2】:

    它有助于使用 DBMS_LOB_CREATETEMPORARY 过程分配 BLOB。

    DECLARE
      v_blob BLOB;
    BEGIN
      DBMS_LOB_CREATETEMPORARY(v_blob, TRUE);
      v_raw_var := 'abcde';
      DBMS_LOB.APPEND(v_blob, v_raw_var);
    
      INSERT INTO myTab (Key, MyBlobField)
      VALUES (1, v_blob);
    
      COMMIT;
    END;
    

    【讨论】:

      【解决方案3】:
      <?php
      
         include '../conexao_oracle.php';
      
         $db->beginTransaction(); // VERY IMPORTANT !
         $stmt = $db->prepare(
             "INSERT INTO packets (packet) ".
             "VALUES (EMPTY_BLOB()) ".
             "RETURNING packet INTO :packet");
         $stmt->bindParam(':packet', $blob, PDO::PARAM_LOB);
         $blob = fopen($nist->getActualFile(), 'rb');
         $stmt->execute();
         $db->commit();
      

      【讨论】:

        猜你喜欢
        • 2013-11-29
        • 1970-01-01
        • 2019-11-19
        • 2017-05-06
        • 2019-11-06
        • 2012-03-12
        • 2018-11-13
        • 2014-11-26
        • 2019-11-24
        相关资源
        最近更新 更多