我正在使用这个包装器,因为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)
任何想法我做错了什么?
答案 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();