以下是Oracle中的一个表:
CREATE TABLE upload_blob ( id NUMBER, doc BLOB );
CREATE SEQUENCE doc_id;
现在是一个存储过程:
CREATE OR REPLACE PROCEDURE prUpload ( p_id OUT NUMBER, p_doc IN BLOB ) AS
BEGIN
INSERT INTO upload_blob ( id, doc ) VALUES ( doc_id.NEXTVAL, p_doc )
RETURNING id INTO p_id;
END;
现在我想从PHP插入到表中。我看到的示例是通过使用EMPTY_BLOB将INSERT插入到表中,然后用内容填充OCI_DLOB类型变量来实现这一点的。
然而,在我的情况下,不喜欢直接访问表,因此为什么要创建存储过程。
我的PHP代码如下:
$sql = <<<EOF
begin
pr_upLoad
(
p_doc => :p_doc_blob,
p_id => :p_doc_id
);
end;
EOF;
$stmt = oci_parse ( $db_conn, $sql );
$docId = "";
$blob = oci_new_descriptor ( $db_conn, OCI_D_LOB);
$file = file_get_contents($_FILES['docName']['tmp_name']);
$blob->write ( $file );
oci_bind_by_name ( $stmt, ':p_doc_id', $docId, 20);
oci_bind_by_name ( $stmt, ':p_doc_blob', $blob, -1, OCI_B_BLOB);
if ( oci_execute ( $stmt, OCI_DEFAULT ) && empty ($errMsg) )
{
oci_commit($db_conn);
$msg = "Document " . $docId . " upload successful.";
}
else
{
$msg = "Document Save failed.";
}
$blob->free();
oci_free_statement($stmt);
这让我犯了以下错误:
警告:第54行saveDoc.php中的OCI Lob::write():OCI_INVALID_HANDLE
第54行如下。
$blob->write ( $file );
我曾尝试更改存储过程以在INSERT中创建一个EMPTY_BLOB并返回EMPTY_BLOB,然后在调用后执行$BLOB->写入,然后执行提交,但这也出现了类似的错误。
我做错了什么?
PHP似乎不喜欢将BLOBS作为过程的参数。
创建一个带有BLOB列的临时暂存表,用EMPTY_BLOB插入其中,将该BLOB映射到PHP变量,然后编写工作。
从不想将表直接公开给PHP连接的帐户的角度来看,这是很糟糕的。因此,我使用存储过程。