powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка ошибок в plpgsql
8 сообщений из 8, страница 1 из 1
Обработка ошибок в plpgsql
    #32925129
Допустим, внутри процедуры выполняется оператор insert и существует вероятность, что вставляемая запись уже существует в таблице. Как данную ситуацию корректно обработать в plpgsql? Существуют ли средства, аналогичные тем, что предоставляет Oracle и Interbase?
...
Рейтинг: 0 / 0
Обработка ошибок в plpgsql
    #32925240
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
35.7.5. Trapping Errors
+универсальный способ - проверять перед вставкой.
...
Рейтинг: 0 / 0
Обработка ошибок в plpgsql
    #32925350
За ссылку однозначно спасибо. Что касается совета проверять перед вставкой - это плохой совет. Это работает, но не всегда.

К примеру, вчера я завел таблицу с полями id и name. По name сделал уникальный индекс. Если проверять наличие записи, а затем делать вставку, то при обычной нагрузке все работает, а вот когда я пустил 100 потоков параллельно, то получил весьма нехилое количество попыток создать дубликаты по полю name. То есть после того как один из потоков установил тот факт, что некая запись отсутствует, другой поток сделал commit, и операция вставки для первого потока обломилась.
...
Рейтинг: 0 / 0
Обработка ошибок в plpgsql
    #32925543
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав СкорыхЗа ссылку однозначно спасибо. Что касается совета проверять перед вставкой - это плохой совет. Это работает, но не всегда.

К примеру, вчера я завел таблицу с полями id и name. По name сделал уникальный индекс. Если проверять наличие записи, а затем делать вставку, то при обычной нагрузке все работает, а вот когда я пустил 100 потоков параллельно, то получил весьма нехилое количество попыток создать дубликаты по полю name. То есть после того как один из потоков установил тот факт, что некая запись отсутствует, другой поток сделал commit, и операция вставки для первого потока обломилась.
если вставка из другой таблицы - обычно так (в одном флаконе)
Код: plaintext
INSERT INTO a FROM b LEFT JOIN a AS a0  USING (name) WHERE a0.name IS NULL;
если из данных - можно так же (т.е.)
Код: plaintext
... FROM (SELECT 'xxx' AS name, xxx AS xxx ) AS b LEFT JOIN a AS a0  ...
а можно в транзакции с блокировками
Код: plaintext
1.
2.
3.
4.
5.
BEGIN;
LOCK xxxxx ;
IF {Test};
  INSERT xxx;
END IF;
COMMIT;
а вообще-то отлуп на вставку - нормальная ситуация - тапки ушли - твое дело отлуп обработать (дать другие тапки / не давать тапок) - от логики.
...
Рейтинг: 0 / 0
Обработка ошибок в plpgsql
    #32925589
assaа вообще-то отлуп на вставку - нормальная ситуация - тапки ушли - твое дело отлуп обработать (дать другие тапки / не давать тапок) - от логики.

Полностью согласен. Потому-то я и заинтересовался, в первую очередь, штатными средствами обработки таких ситуаций в plpgsql. Было бы обидно, если бы их не оказалось.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Обработка ошибок в plpgsql
    #35154269
_PG_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Присоединяюсь к вопросу. На выходе должны получить максимально быстродействующую и легкую вставку в базу при, скажем, при 500 клиентах.
Ситуации:
1) Есть таблица, комбинация полей в которой должна быть уникальна.
Решения:
Уникальный индекс. - Какие подводные камни? Как уникальный индекс влияет на скорость вставки?
Блокировка таблицы - не подходит. Работа клиентов станет последовательной.
Уровень изоляции транзацкции?

2) Тоже самое, только ввиду огромного размера таблицы уникальность нужно проверить за последние 7 дней.
Уникальный индекс уже не подходит. Делать партиционирование? Накладывать ограничение уникальным индексом на "текущую" партицию?

Кто сталкивался с подобными задачами - раскажите пожалуйста как решаются данные задачи? Заранее благодарен!
...
Рейтинг: 0 / 0
Обработка ошибок в plpgsql
    #35157514
raist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм...странно почему никто не посоветовал использовать ексепшены? Например
Begin
Код: plaintext
1.
2.
3.
4.
INSERT INTO table VALUES(bla,bla,bla);
EXCEPTION
WHEN unique_violation THEN
NULL;
END;
Вот
...
Рейтинг: 0 / 0
Обработка ошибок в plpgsql
    #35157855
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
raistХм...странно почему никто не посоветовал использовать ексепшены?
вы невнимательны: http://sql.ru/forum/actualthread.aspx?tid=161470#1334009
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Обработка ошибок в plpgsql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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