Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.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 将BLOB插入Oracle时出错_Php_Mysql_Oracle_Pdo - Fatal编程技术网

Php 将BLOB插入Oracle时出错

Php 将BLOB插入Oracle时出错,php,mysql,oracle,pdo,Php,Mysql,Oracle,Pdo,我使用这个包装器是因为PHP中的Oracle PDO是实验性的: 下面是插入一个BLOB的PHP代码,该BLOB在MySQL中工作,但在Oracle中尚未工作: public function insertPacket($nist) { $blob = fopen($nist->getActualFile(), 'rb'); $sql = "INSERT INTO packets(packet) VALUES(:packet)"; $query = $this->lin

我使用这个包装器是因为PHP中的Oracle PDO是实验性的:

下面是插入一个BLOB的PHP代码,该BLOB在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中,我遇到了以下例外情况: 致命错误:未捕获异常“Oci8Exception”,在第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)

你知道我做错了什么吗

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

我不熟悉PHP方面的内容,但基本上,您的insert语句必须是这样的:

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

它有助于使用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;

我试过了,但还是没能把水滴弄进去。抱歉,下一步需要对PHP和您正在使用的特定库有更深入的了解,而我没有。我只知道如何从您的问题(无效的LOB定位器)中解决您的特定错误,即您需要先创建一个空blob,然后才能绑定到它。然后,作为最后一步,您可以将字节推入。很抱歉,最后一部分我帮不上忙。但希望你现在更接近一个解决方案。
<?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();