将BLOB插入Oracle时出错

时间:2015-06-26 01:53:37

标签: php mysql oracle pdo

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

以下是插入在MySQL中有效但尚未在Oracle中运行的BLOB的PHP代码:

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 \包含\ 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)

任何想法我做错了什么?

3 个答案:

答案 0 :(得分:0)

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

我不熟悉PHP的一面,但基本上,你的insert语句必须是这样的:

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

答案 1 :(得分:0)

使用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;

答案 2 :(得分:0)

<?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();
相关问题