Php 将BLOB插入Oracle时出错
我使用这个包装器是因为PHP中的Oracle PDO是实验性的: 下面是插入一个BLOB的PHP代码,该BLOB在MySQL中工作,但在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
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();