Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Передача BLOB из PHP в Oracle  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1018
Подскажите, пожалуйста, кто работал с BLOB'ми.

Написал вот такую хранимую процедуру:

create or replace procedure p_test(p_blob in blob)
as
  l_total_size  number(20);
begin
    l_total_size := dbms_lob.getlength(p_blob);
end;


Из PHP после соединения с ораклом пытаюсь выполнить эту процедуру засылая в неё блоб:

$file_name = "test.txt";
$fcontent = file_get_contents($file_name);
$theblob = oci_new_descriptor($base);

$sql = "begin p_test(:theblob); end;";

$stid = oci_parse($base, $sql);
oci_bind_by_name($stid, ":theblob", $theblob, -1, OCI_B_BLOB);
if (oci_execute($stid, OCI_NO_AUTO_COMMIT)) {
  $theblob->save($fcontent); 
  oci_commit($base);
}


получаю ошибку:

ORA-22275: invalid LOB locator specified
ORA-06512: at "SYS.DBMS_LOB", line 775
ORA-06512: at "BES.P_TEST", line 5


Нашел такой коммент:

A LOB is a pointer/reference to a memory/disk storage. You need to "memalloc()" (... initialize) the storage first, assign the pointer/reference to your LOB variable. That's what dbms_lob.createTemporary() is for. Unless you initialize a LOB variable with a valid LOB locator, all your operations on that LOB variable will fail with ORA-22275: invalid LOB locator specified.


Получается что нужно выделять вручную память для этого блоба, сделал так:

create or replace procedure p_test(p_blob in blob)
as
  l_total_size  number(20);
  l_blob        blob;
begin
   dbms_lob.createtemporary(l_blob, TRUE);
    l_blob := p_blob;
    l_total_size := dbms_lob.getlength(l_blob);
   dbms_lob.freetemporary(l_blob);
end;


не помогло...
9 ноя 18, 15:00    [21729654]     Ответить | Цитировать Сообщить модератору
 Re: Передача BLOB из PHP в Oracle  [new]
Да ну
Member

Откуда: Первопрестольная
Сообщений: 242
verter,
 $theblob  = oci_new_descriptor($base);
 
 $stin = oci_parse($base, "begin dbms_lob.createtemporary(:theblob, TRUE); end;");
 oci_bind_by_name($stin, ":theblob", $theblob, -1, OCI_B_BLOB);
 oci_execute($stin, OCI_NO_AUTO_COMMIT);

 $file_name = "test.txt";
 $fcontent = file_get_contents($file_name);
 $theblob->save($fcontent); 

 $stid = oci_parse($base, "begin p_test(:theblob); end;");
 oci_bind_by_name($stid, ":theblob", $theblob, -1, OCI_B_BLOB);
 oci_execute($stid, OCI_NO_AUTO_COMMIT);
 oci_commit($base);
 
 $theblob->free();
9 ноя 18, 17:53    [21729973]     Ответить | Цитировать Сообщить модератору
 Re: Передача BLOB из PHP в Oracle  [new]
Да ну
Member

Откуда: Первопрестольная
Сообщений: 242
Или так:
 $theblob  = oci_new_descriptor($base);
 $file_name = "test.txt";
 $fcontent = file_get_contents($file_name);
 $theblob->writeTemporary($fcontent,OCI_TEMP_BLOB);
 $stid = oci_parse($base, "begin p_test(:theblob); end;");
 oci_bind_by_name($stid, ":theblob", $theblob, -1, OCI_B_BLOB);
 oci_execute($stid);
 $theblob->close();
9 ноя 18, 18:13    [21729992]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить