2013-05-14 58 views
1

我想以同樣的方式做一個更新(C)LOB插入。 (插入已經在工作)。如何在oracle中用PHP更新LOB? (OCI_INVALID_HANDLE)

$queryHandle = oci_parse($dbHandle, "update MYTABLE set "MYCLOB" = EMPTY_CLOB() , "OTHERCOL" = :col0 where "PKIDCOL" = :wherecol0 returning "OTHERCOL" , "MYCLOB", into :retcol0 , :retcol1"); 
if(!is_resource($queryHandle)) { 
$error=oci_error($dbHandle); 
die($error['message'], $error['code']); 
} 
oci_bind_by_name($queryHandle, ":col0", $othercolvalue); 
oci_bind_by_name($queryHandle, ":wherecol0", $pkidcol); 
oci_bind_by_name($queryHandle, ":retcol0", $retcol1, 100); 
$lob=oci_new_descriptor($dbHandle); 
oci_bind_by_name($queryHandle, ":retcol1", $lob, -1, SQLT_CLOB); 
if(!oci_execute($queryHandle , OCI_NO_AUTO_COMMIT)) { 
$error=oci_error($dbHandle); 
die($error['message'], $error['code']); 
} 
$lob->save($mylobvalue); // gives an PHP Warning: OCI-Lob::save(): OCI_INVALID_HANDLE in file.php on line 123 

這不更新LOB並給出了一個:PHP Warning: OCI-Lob::save(): OCI_INVALID_HANDLE in file.php on line 123

+1

這在文件中提到:'如果你是在一個更新語句中使用保存(),PHP將拋出一個警告類似「OCILobWrite:OCI_INVALID_HANDLE ......」如果你的update語句沒有抓到任何行與其where子句。「因此,在你更新數據庫之前,你需要確保你的條件匹配。在你的例子中'$ queryHandle'對於保存有效。 – Leri 2013-05-14 10:05:36

+0

謝謝。這確實是這個問題。 :-) – JMW 2013-05-14 13:17:28

+0

不客氣。 ;) – Leri 2013-05-14 13:47:45

回答

1

有幾十如何插入/有LOB值更新行的例子。

首先,你必須創建一個LOB描述:

$desc = oci_new_descriptor($connection, OCI_DTYPE_LOB); 

然後用這個描述爲你的綁定值的LOB佔位符:

oci_bind_by_name($queryHandle, ":retcol1", $desc, -1, SQLT_CLOB); 

然後臨時寫入數據:

$desc->writeTemporary($data); 

然後執行該查詢。 ..

更多的信息可以在documentation找到+仔細閱讀所有的評論更多的例子!

一些例子使用$desc->write($data); + execute + commit,有些使用execute + $desc->saveFile($data); + commit,都應該工作。