Простой пример закачки файла в ORACLE BLOB не работает

uZzbek

Новичок
Простой пример закачки файла в ORACLE BLOB не работает

Берём zip файлик, размером 10 килобайт, с правами 777, существующий на линух сервере.
Коннектимся к существующей бд в оракле
Пробуем вставить файл в существующую таблицу
CREATE TABLE TEST_BLOB
(
CNT NUMBER,
BLOBA BLOB
)

Код выполняется без ошибок (error_reporting E_ALL, display_errors on).
Выдаёт желаемое "Blob successfully uploaded".

НО - в таблице записей не прибавляется :(

Вот код:

PHP:
<?php
$filenam=$_SERVER['DOCUMENT_ROOT']."/tmp.zip";
$conn = oci_connect("phone", "phone", "serv/phone");
$lob = oci_new_descriptor($conn, OCI_D_LOB);
$stmt = oci_parse($conn, "insert into TEST_BLOB (CNT, BLOBA) values('1', EMPTY_BLOB()) returning BLOBA into :the_blob");
oci_bind_by_name($stmt, ':the_blob', &$lob, -1, OCI_B_BLOB);
oci_execute($stmt, OCI_DEFAULT);
if ($lob->savefile($filenam)){
 oci_execute($conn);
 echo "Blob successfully uploaded\n";
}
else{
 echo "Couldn't upload Blob\n";
}
oci_free_descriptor($lob);
oci_free_statement($stmt);
oci_close($conn);
?>
что я делаю не так? может что-то неверно в коде? или есть какие-то неучтённые ньюансы?
 

uZzbek

Новичок
oci_execute() выполняет предварительно подготовленное к выполнению выражение SQL (см. oci_parse()). Необязательный третий параметр mode позволяет вам указывать режим выполнения (по умолчанию он равен OCI_COMMIT_ON_SUCCESS). Если вы не хотите, чтобы после выполнения выражения автоматически выполнялся оператор COMMIT, завершающий транзакцию, то вам необходимо указать OCI_DEFAULT, как значение параметра mode.

другими словами - oci_commit() происходит по умолчанию автоматом. (если я не ошибаюсь)
 

Falc

Новичок
oci_execute($stmt, OCI_DEFAULT);
По умолчанию автоматом, а в твоем примере нет.
 

uZzbek

Новичок
кажеца там ошибка - вместо второго oci_execute($conn) должен быть oci_commit($conn)

-~{}~ 10.05.07 11:50:

мда, действительно, помогла внимательность людей :)

правильный вариант вот такой (проверено, работает):

PHP:
<?php
$filenam=$_SERVER['DOCUMENT_ROOT']."/tmp.zip";
$conn = oci_connect("phone", "phone", "serv/phone");
$lob = oci_new_descriptor($conn, OCI_D_LOB);
$stmt = oci_parse($conn, "insert into TEST_BLOB (CNT, BLOBA) values('1', EMPTY_BLOB()) returning BLOBA into :the_blob");
oci_bind_by_name($stmt, ':the_blob', &$lob, -1, OCI_B_BLOB);
oci_execute($stmt, OCI_DEFAULT);
if ($lob->savefile($filenam)){
 oci_commit($conn);
 echo "Blob successfully uploaded\n";
}
else{
 echo "Couldn't upload Blob\n";
}
oci_free_descriptor($lob);
oci_free_statement($stmt);
oci_close($conn);
?>
Надо обязательно исправить эту ошибочку в официальном доке:
http://ua2.php.net/manual/ru/function.oci-new-descriptor.php

Сенкс.
 
Сверху