Pull to refresh

Comments 13

Про SKIP LOCKED совет не очень, т.к. Oracle не рекомендует использовать его напрямую: «Oracle recommends that you use the Oracle Streams Advanced Queuing APIs instead of directly using the SKIP LOCKED functionality».

Для FORALL полезно было бы рассказать про SQL%BULK_EXCEPTIONS и новый удобный синтаксис FORALL x IN INDICES OF table_type_ (и выглядит симпатичней и очень помогает при разреженных коллекциях)
Ну это зависит от конкретной ситуации, да и это уже относится к общему дизайну конкретной системы, и скачок с for update до dbms_aq мне кажется слишком резким особенно в рамках одной заметки. Кайт, например, в случае конкретного вопроса проверки блокировок просто советовал skip locked — тема слишком крупна для рассмотрения в одной заметке.
А про отладку и тестирование в общем-то я планировал отдельную статью написать, только вот не знаю когда в очередной раз поднимутся на это руки :)
Кстати, ещё на счёт коллекций вспомнил: оракл крайне неохотно отдаёт память, ранее отданную под коллекции:

declare
  type t_bi is table of binary_integer index by binary_integer;
  v_bi t_bi;
begin
  -- перед началом теста занято 2666872 PGA
  for i in 1..n loop v_bi(i) := i; end loop;
  -- после заполнения коллекции — 31895928
  v_bi.delete;
  -- после удаления всех записей — 31895928 (внезапно...)
  -- подчищаем память
  dbms_session.free_unused_user_memory;
  -- после очистки — 2666872
end;


При интенсивной работе с коллекциями стоит это учитывать.
Еле вспомнил где читал и специально нашел — прочитайте у Кайта в «Expert One-on-One Oracle» главу «Области PGA и SGA». Цитата у него про dbms_session.free_unused_user_memory: «Учтите, однако, что в большинстве систем это действие — пустая трата времени.»
Упс, хотя я и не совсем подходящую цитату привел(невнимательно прочел тест-кейс), но тем не менее это рассматривается в этой главе :)
Спасибо, было интересно прочитать. Особенно про нюансы с TYPE и ROWTYPE.
Там еще веселая «глюка» бывает, если при откомпилированном пакете изменить размер столбца в таблице.
Вызывает по началу когнитивный диссонанс :)
а где обещанные заголовком нюансы-то?
О, вы специалист по ораклу и все это знали? Тогда может технический комментарий будет, а не троллинг?
На самом деле у меня претензия более по стилю и формулировке, нежели по содержанию: я не вижу формулировок нюансов. Вот в первом подразделе — вижу код, сообщение об ошибке, и описание причины ошибки. А по-хорошему — после кода и соообщения об ошибке так и хочется увидеть резюмирующую фразу типа такой: «Вот смотрите, переменная в PL/SQL-блоке объявлена со ссылкой на фактический тип колонки, а селект в неё из этой колонки не выполняется!» и только после неё писать ваше «Причина ошибки кроется в том, ...»

Чуть раньше — Вы пишите «Как видите, значение прекрасно вставилось.» — но мы-то не видим! Вы не привели результата выполнения ранее показанной команды!
Ну формулировка то есть — причина описана, а результат я не вывел потому что хотел дать код удобный для копирования и выполнения, но раз хотите, то добавлю и вывод
Кстати говоря, поймав ошибку через when others then ..., Вы потеряли отображение номера строки, на которой эта ошибка произошла. Лучше б не ловили, а дали её поймать среде выполнения. Вдруг она вообще произошла при выполнении dbms_output.put_line('Все ок, значение=' || l_a);?
Number precision too large? :) можно, конечно, это нарочно сэмулировать — создать в этой схеме свой такой пакет с этой функцией и в нем вызвать ошибку, но это было бы очень странно.
Sign up to leave a comment.

Articles