Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Работа с LOB  [new]
Guestus
Guest
Привет.
Смотрел Oracle® Database Application Developer's Guide - Large Objects, но не нашел там ответы на возникнувшие вопросы:
1. Почему обязательно использовать for update для последующего изменения lob?
2. Почему после действий
declare
  a1 clob;
  a2 clob;
begin
  select s.b, s.b into a1, a2 from s where rownum = 1 for update;
  dbms_lob.open(a1, dbms_lob.lob_readwrite);
  dbms_lob.write(a1, 3, 1, '123');
  dbms_lob.close(a1);
end;
a1 и a2 указывают на разные данные?
3) Почему не прокатит вместо
  dbms_lob.open(a1, dbms_lob.lob_readwrite);
  dbms_lob.write(a1, 3, 1, '123');
  dbms_lob.close(a1);
сделать a1 := '123' ?
4 май 08, 16:06    [5622139]     Ответить | Цитировать Сообщить модератору
 Re: Работа с LOB  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Guestus
1. Почему обязательно использовать for update для последующего изменения lob?


Следует подумать над тем, что содержит поле типа [c/b]lob в общем случае, и как обеспечивается
целостность LOB-данных.
В документации раскрыты понятия LOB Locator и LOB Value (если читать ее не по диагонали,
разумеется).

Guestus

2. Почему после действий
declare
  a1 clob;
  a2 clob;
begin
  select s.b, s.b into a1, a2 from s where rownum = 1 for update;
  dbms_lob.open(a1, dbms_lob.lob_readwrite);
  dbms_lob.write(a1, 3, 1, '123');
  dbms_lob.close(a1);
end;
a1 и a2 указывают на разные данные?


Ответ проистекает из "подумать над 1-м пунктом".

Guestus

3) Почему не прокатит вместо
  dbms_lob.open(a1, dbms_lob.lob_readwrite);
  dbms_lob.write(a1, 3, 1, '123');
  dbms_lob.close(a1);
сделать a1 := '123' ?


Аналогично - читать и думать.
4 май 08, 16:35    [5622375]     Ответить | Цитировать Сообщить модератору
 Re: Работа с LOB  [new]
Guestus
Guest
Разобрался почему не прокатило сделать a1 := '123' - в данном случае просто создается временный clob, в который записывается '123'.
SQL> set serveroutput on;
SQL> 
SQL> declare
  2    l_b1 clob;
  3    l_b2 clob;
  4    procedure print_temporary is
  5    begin
  6      dbms_output.put_line(dbms_lob.istemporary(l_b1));
  7      dbms_output.put_line(dbms_lob.istemporary(l_b2));
  8      dbms_output.put_line('--');
  9    end print_temporary;
 10  begin
 11    select t.b,
 12           t.b
 13    into   l_b1,
 14           l_b2
 15    from   t
 16    where  rownum = 1
 17    for    update;
 18  
 19    print_temporary;
 20    l_b1 := '123';
 21    print_temporary;
 22  end;
 23  /
 
0
0
--
1
0
--
 
PL/SQL procedure successfully completed

1. На счет блокировки не совсем понятно - почему после
lock table t in exclusive mode;
изменить clob все равно не получается -
ORA-22920: row containing the LOB value is not locked

2. Почему Oracle требует чтобы транзакция была начата(например, set transaction read write или получение блокировки TX) до изменения lob? Иначе генерируется ошибка
ORA-22292: Cannot open a LOB in read-write mode without a transaction

3. Все таки не въезжаю почему локаторы a1 и a2 из первого поста указывают на разные данные?
4 май 08, 19:22    [5623083]     Ответить | Цитировать Сообщить модератору
 Re: Работа с LOB  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Guestus
1. На счет блокировки не совсем понятно - почему после
lock table t in exclusive mode;
изменить clob все равно не получается -
ORA-22920: row containing the LOB value is not locked


Ну Oracle же подсказывает - row is not locked.
Читать Concepts и понять разницу между блокировкой таблицы и блокировкаой строки.

Guestus

2. Почему Oracle требует чтобы транзакция была начата(например, set transaction read write или получение блокировки TX) до изменения lob? Иначе генерируется ошибка
ORA-22292: Cannot open a LOB in read-write mode without a transaction

3. Все таки не въезжаю почему локаторы a1 и a2 из первого поста указывают на разные данные?


Read Consistent Locator
4 май 08, 19:46    [5623128]     Ответить | Цитировать Сообщить модератору
 Re: Работа с LOB  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
И еще PCTVERSION
4 май 08, 19:54    [5623152]     Ответить | Цитировать Сообщить модератору
 Re: Работа с LOB  [new]
Guestus
Guest
Огромное спасибо!
4 май 08, 20:31    [5623254]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить