Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа в оракле с полем blob(update), не получается! 
:(
    Опции темы
proger
  Дата 30.1.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 10.10.2004

Репутация: нет
Всего: 1



Здрасти, пишу в оракал в блоб поле данные очень большего размера (больше 255) таким способом:
Код

$blobdata="hhhhhhhhhhhhhfgdhjkghfsjkhgkjfdshsjkdghjfdshgjfdkshgjkfdhgjfdhgjkfdshgdshjkghfdsjkghjfdkhgfdjhgfdjhgjfdhgjkfdhsgjkfdhgjkfdhsjghsruyhwuihtgjkhfbgbsdjkghjkrehgjkhrewjkghjkhfdjkshgjkfdshgjkfdshgjkdsfghjkfdsghjdkfghjkdfhgurieyhwgkhfdsgjkhfsdgjkfdhsjkgsdgdlghsdkfjghdsfukghruiehguierhguihhhhhhhhhhhhhfgdhjkghfsjkhgkjfdshsjkdghjfdshgjfdkshgjkfdhgjfdhgjkfdshgdshjkghfdsjkghjfdkhgfdjhgfdjhgjfdhgjkfdhsgjkfdhgjkfdhsjghsruyhwuihtgjkhfbgbsdjkghjkrehgjkhrewjkghjkhfdjkshgjkfdshgjkfdshgjkdsfghjkfdsghjdkfghjkdfhgurieyhwgkhfdsgjkhfsdgjkfdhsjkgsdgdlghsdkfjghdsfukghruiehguierhgui";

$stmt = oci_parse($connect, "INSERT INTO DOC ( ID,FILES ) VALUES ( 1, EMPTY_BLOB() ) returning FILES into :FILES");
  $lob = oci_new_descriptor($connect, OCI_D_LOB);
  oci_bind_by_name($stmt, ':FILES', &$lob, -1, OCI_B_BLOB);
  oci_execute($stmt, OCI_DEFAULT);
  $lob->write($blobdata);
  OCI_Commit($connect);
  $lob->free();
  oci_free_statement($stmt);

Все отлично работает!
Но при UPDATE не пашет:
Код

$blobdata="234hhhhhhhhhhhhhfgdhjkghfsjkhgkjfdshsjkdghjfdshgjfdkshgjkfdhgjfdhgjkfdshgdshjkghfdsjkghjfdkhgfdjhgfdjhgjfdhgjkfdhsgjkfdhgjkfdhsjghsruyhwuihtgjkhfbgbsdjkghjkrehgjkhrewjkghjkhfdjkshgjkfdshgjkfdshgjkdsfghjkfdsghjdkfghjkdfhgurieyhwgkhfdsgjkhfsdgjkfdhsjkgsdgdlghsdkfjghdsfukghruiehguierhguihhhhhhhhhhhhhfgdhjkghfsjkhgkjfdshsjkdghjfdshgjfdkshgjkfdhgjfdhgjkfdshgdshjkghfdsjkghjfdkhgfdjhgfdjhgjfdhgjkfdhsgjkfdhgjkfdhsjghsruyhwuihtgjkhfbgbsdjkghjkrehgjkhrewjkghjkhfdjkshgjkfdshgjkfdshgjkdsfghjkfdsghjdkfghjkdfhgurieyhwgkhfdsgjkhfsdgjkfdhsjkgsdgdlghsdkfjghdsfukghruiehguierhgui";

$stmt = oci_parse($connect, "UPDATE DOC SET FILES=EMPTY_BLOB() WHERE ID=1 returning FILES into :FILES");
  $lob = oci_new_descriptor($connect, OCI_D_LOB);
  oci_bind_by_name($stmt, ':FILES', &$lob, -1, OCI_B_BLOB);
  oci_execute($stmt, OCI_DEFAULT);
  $lob->write($blobdata);
  OCI_Commit($connect);
  $lob->free();
  oci_free_statement($stmt);

А вот это не пашет, пишет: Warning: OCI-Lob::write() [function.write]: OCILobGetLength: OCI_INVALID_HANDLE in c:\ibank\inc\system\paydockz.php
Почему????
PM MAIL   Вверх
Mal Hack
Дата 30.1.2006, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 11
Всего: 261



Запрос сам выполняется?
Ошибки нет?

Если честно, я с ораклом не работал, думаю тут специфика какая-то. Скорее всего где-то не верно параметр или режим указал.
PM ICQ   Вверх
LSD
Дата 30.1.2006, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: нет
Всего: 538



В lob locator возвращаемый empty_clob(), писать нельзя.
Используй вместо него или dbms_lob.createtemporary(), но тут придется возится с PL/SQL процедурами. Или вначале проведи insert, а затем select и тогда уже пиши в LOB.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
proger
Дата 31.1.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 10.10.2004

Репутация: нет
Всего: 1



LSD
А пример можно???
PM MAIL   Вверх
LSD
Дата 31.1.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: нет
Всего: 538



Цитата(proger @ 31.1.2006, 10:32 Найти цитируемый пост)
А пример можно???

На PHP нет, я с ним не знаком, на Java пожалуйста (тебе нужен второй вариант).

Тебе надо сделать приблизительно следующее, объявить переменную типа blob. Вызвать функцию dbms_lob.createtemporary указав в качестве аргумента эту переменную, затем заполняешь blob данными и вставляешь его в таблицу. После чего вызываешь dbms_lob.freetemporary для этого blob.

Если поможет на PL/SQL это выглядит так:
Код
declare
  data  blob;
begin
  dbms_lob.createtemporary(data, true, dbms_lob.call);
  dbms_lob.write(data, 16, 1, HEXTORAW('23696E636C756465203C77696E646F77'));
  insert into blob_tbl (blob_col) values (data);
  dbms_lob.freetemporary(data);
end;
/


Как произвести вначале insert, а потом select разберешься сам?


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
proger
Дата 1.2.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 10.10.2004

Репутация: нет
Всего: 1



LSD
А других способов нету???
PM MAIL   Вверх
LSD
Дата 2.2.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: нет
Всего: 538



Я извиняюсь, был не выспамшись, написал бред. Я почему то подумал, что речь идет об insert.

С update делай так:

Делаешь select for update для этой строки:
Код
select FILES into :FILES from DOC where ID = 1 for update nowait


Затем пишешь в этот blob.

Только смотри чтобы в столбце не было null, пустой blob допустим а null нет.



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.2267 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.