php - 如何使用 PHP 更新 oracle 上的 CLOB 列
问题描述
我的功能有问题:
function updateClob($id_tow,$description_csv,$conn) {
$sql = "UPDATE SHOPPER_PRODUCTS SET SHOP_TO_DESCRIPTION = EMPTY_CLOB() WHERE ID_TOW =
'$id_tow' RETURNING SHOP_TO_DESCRIPTION INTO :lob";
echo $sql."\n";
//echo $sql."\n";
$clob = OCINewDescriptor($conn, OCI_D_LOB);
$stmt = OCIParse($conn, $sql);
OCIBindByName($stmt, ':lob', $clob, -1, OCI_B_CLOB);
OCIExecute($stmt,OCI_DEFAULT);
if($clob->save($description_csv)){
OCICommit($conn);
echo " Updated"."\n";
}else{
echo " Problems: Couldn't upload Clob. This usually means the where
condition had no match \n";
}
$clob->free();
OCIFreeStatement($stmt);
}
执行后我得到“更新”,但在数据库列是空的。在执行之前,我在此列上有 null。
解决方案
这里有两种方法。架构是:
create table photo_tab (photo blob, photo_id number);
代码如下:
// Update an existing BLOB
$photo_id = 1;
$stid = oci_parse($con, "insert into photo_tab (photo, photo_id) values(empty_blob(), :photo_id)");
$r = oci_bind_by_name($stid, ":photo_id", $photo_id);
$r = oci_execute($stid, OCI_DEFAULT);
oci_commit($con);
$sql = "update photo_tab set photo = empty_blob() where photo_id = :photo_id returning photo into :photo";
$stid = oci_parse($con, $sql);
$blob = oci_new_descriptor($con, OCI_D_LOB);
oci_bind_by_name($stid, ":photo_id", $photo_id);
oci_bind_by_name($stid, ":photo", $blob, -1, OCI_B_BLOB);
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
$blob->savefile("/tmp/oraclelogo.jpg");
$blob->free();
oci_commit($con);
oci_free_statement($stid);
// Update an existing BLOB using a Temp BLOB
$photo_id = 2;
$stid = oci_parse($con, "insert into photo_tab (photo, photo_id) values(empty_blob(), :photo_id)");
$r = oci_bind_by_name($stid, ":photo_id", $photo_id);
$r = oci_execute($stid, OCI_DEFAULT);
oci_commit($con);
$sql = "update photo_tab set photo = :photo where photo_id = :photo_id";
$stid = oci_parse($con, $sql);
$blob = oci_new_descriptor($con, OCI_D_LOB);
oci_bind_by_name($stid, ":photo_id", $photo_id);
oci_bind_by_name($stid, ":photo", $blob, -1, OCI_B_BLOB);
$blob->writeTemporary("/tmp/oraclelogo.jpg");
$r = oci_execute($stid, OCI_NO_AUTO_COMMIT);
$blob->close();
oci_commit($con);
oci_free_statement($stid);
您可能想查看 Oracle 的免费 PHP 书籍The Underground PHP and Oracle Manual的后半部分。
推荐阅读
- html - 使用具有相似数据绑定的两个单独的 div 时,数据绑定不起作用
- sql - 无法插入数据?
- javascript - 如何解决 React 中的“sourceSelector 不是函数”?
- docker - .NET Core 3.0 Web API 不会在 Docker 容器中启动
- javascript - 学习 OOP Javascript,我真的很努力,但它并没有陷入困境。有人可以帮我解决这个问题吗?
- python - 是否可以从 QPrintDialog 调用的 QPrinter 对话框中取消选中“打印到文件”?
- kubernetes - 超额订阅的 Kubernetes 集群上的小 pod 饿死了大 pod
- sql - SQL Server:基于结果集的不同行的列上的未来值
- azure-sql-data-warehouse - 为什么 CTE 在 Sql 数据仓库中的性能比临时表好得多?
- html - Signaturepad 清除属性未在模式引导对话框中清除