powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача BLOB из PHP в Oracle
3 сообщений из 3, страница 1 из 1
Передача BLOB из PHP в Oracle
    #39730628
verter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста, кто работал с BLOB'ми.

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

Код: sql
1.
2.
3.
4.
5.
6.
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 после соединения с ораклом пытаюсь выполнить эту процедуру засылая в неё блоб:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
$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.


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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;



не помогло...
...
Рейтинг: 0 / 0
Передача BLOB из PHP в Oracle
    #39730804
Да ну
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
verter,
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 $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();
...
Рейтинг: 0 / 0
Передача BLOB из PHP в Oracle
    #39730813
Да ну
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
 $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();
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Передача BLOB из PHP в Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]