2012-03-22 64 views
0

我有一個Oracle數據庫,我正在使用PHP OCI8連接到該數據庫。我的一種方法是使用Base64編碼圖像並對其進行解碼並嘗試將圖像作爲Blob插入。 Oracle拋出一個異常標識符太長。插入blob時標識符太長

$query = " 
    insert into field_call_photos (photo_datetime, field_call_visit_pk, photo, field_call_photo_type_pk) 
    values (to_date('$visitDT $visitDTHrs $visitDTMins $visitDTAmpm','mm/dd/yyyy hh:mi am'), 
     '$newFcvPK', utl_encode.base64_decode(utl_raw.cast_to_raw($fileBlob)),'$fileTypePK')"; 

回答

1

您的代碼似乎在不引用的情況下將文件內容插入到SQL查詢中,這可能會使Oracle認爲它是一個標識符。我想用OCIblob functions代替。事情是這樣的:

$stmt = oci_parse($database, "INSERT INTO (a,b,c, photo) VALUES('aval','bval','cval', EMPTY_BLOB()) RETURNING photo INTO :photo"); 
$newlob = oci_new_descriptor($database, OCI_D_LOB); 
oci_bind_by_name($stmt, ":photo", $newlob, -1, OCI_B_BLOB); 
oci_execute($stmt,OCI_DEFAULT); 
$newlob->save(base64_decode($fileBlob)); 
oci_commit($stmt); 
// cleanup 
$newlob->free(); 
oci_free_statement($stmt); 

我省略錯誤檢查簡單,你需要檢查解析和執行正確返回的東西,用oci_error,看看有什麼地方出了錯。

0

使用Codeigniter連接,並修復oci_commit在哪裏應該是連接ID。

$db = $this->load->database('oracle', true); 
$stmt = oci_parse($db->conn_id, "INSERT INTO LOTUS.PROCESO_ARCHIVO (ARCHIVO) VALUES(EMPTY_BLOB()) RETURNING archivo INTO :archivo"); 
$newlob = oci_new_descriptor($db->conn_id, OCI_D_LOB); 
oci_bind_by_name($stmt, ":archivo", $newlob, -1, OCI_B_BLOB); 
oci_execute($stmt,OCI_DEFAULT);   
$newlob->save(file_get_contents($file_path)); 
oci_commit($db->conn_id); 
$newlob->free(); 
oci_free_statement($stmt);