插入blob时标识符太长

时间:2012-03-22 06:21:57

标签: php oracle base64

我有一个Oracle数据库,我正在使用PHP OCI8连接。我的一个方法采用Base64编码图像并对其进行解码并尝试将图像作为Blob插入。 Oracle抛出异常标识符太长。

$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')";

2 个答案:

答案 0 :(得分:1)

您的代码似乎在没有引用的情况下将文件内容插入到SQL查询中,这可能使Oracle认为它是一个标识符。

我会改用OCI blob 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来查看错误。

答案 1 :(得分: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);