通过存储过程将PHP中的BLOB写入Oracle

时间:2013-08-11 18:07:45

标签: php stored-procedures plsql blob

这是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_D_LOB类型变量。

但是,在我的情况下,不喜欢直接访问表,因此为什么要创建存储过程。

我的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);

这让我想到以下错误:

警告:OCI-Lob :: write():第54行的saveDoc.php中的OCI_INVALID_HANDLE

第54行如下。

$blob->write ( $file );

我尝试更改存储过程以在INSERT中创建EMPTY_BLOB并返回EMPTY_BLOB,然后在调用之后执行$ blob-&gt;写入,然后执行提交,但这也会产生类似的错误。< / p>

我做错了什么?

1 个答案:

答案 0 :(得分:1)

似乎BLOBS作为程序的参数不被PHP所喜欢。

创建一个带有BLOB列的临时登台表,使用EMPTY_BLOB INSERT到该表,将该blob映射到PHP变量然后写入工作。

从不希望将表直接暴露给PHP连接的帐户的角度来看,这很糟糕。因此,为什么我使用存储过程。