Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
24.05.2007, 23:49
|
|||
|---|---|---|---|
функция PL/pgSQL выдает необъяснимую ошибку |
|||
|
#18+
Приветствую, господа. Помогите, пожалуйста, найти ошибку в функции. Функция получает на входе число и текстовую строку (которая содержит url) в качестве аргументов. Далее порядок ее работы таков: -пытается добавить переданный url в первую таблицу, которая имеет уникальный индекс по этому полю. Если такой url уже есть в ней - функция завершается и возвращает 1. Если удачно добавилось - идет дальше. -пытается добавить url в таблицу, имя которой получаем с пом. переданного числа(она тоже имеет уникальный индекс по этому полю). Если если удачно - выход со статусом 0. Иначе (если уже есть такой url в этой таблице) - приводит значения всех полей в строке первой таблицы, где такой же url, в соответствие со значениями полей в данной таблице. И выход со статусом 1. Вот сама функция: CREATE OR REPLACE FUNCTION add_url(INTEGER, TEXT) RETURNS INTEGER AS $$ DECLARE NNN ALIAS FOR $1; URL ALIAS FOR $2; REZ RECORD; QUER TEXT; BEGIN --add to first table BEGIN INSERT INTO first_table (url_field, some_num) VALUES (URL, -11); EXCEPTION WHEN unique_violation THEN RETURN 1; END; --add to another table BEGIN EXECUTE 'INSERT INTO table_num_' || NNN || ' (url_field, some_num) VALUES (' || quote_literal(URL) || ', -11)'; EXCEPTION WHEN unique_violation THEN QUER := 'SELECT field_a, field_b, field_c, field_d FROM table_num_' || NNN || ' WHERE url_field = ' || quote_literal(URL); EXECUTE QUER INTO REZ; UPDATE first_table SET field_a = REZ.field_a, field_b = REZ.field_b, field_c = REZ.field_c, field_d = REZ.field_d WHERE url_field = URL; RETURN 1; END; RETURN 0; END; $$ LANGUAGE 'plpgsql'; ------------------ Изредка (несколько раз в сутки) эта функция вылетает с ошибкой (вижу в логе). Вот кусок лога: ERROR: type of "rez.field_c" does not match that when preparing the plan CONTEXT: PL/pgSQL function "add_url" line 21 at SQL statement STATEMENT: SELECT add_url(810, 'http://www.xyz.com/mfhighlife/') Типы данных в полях такие: field_a - text field_b - text field_c - integer field_d - timestamp without time zone Все потестил, функция прекрасно работает при любых вариантах (заходах в любую ветвь), а вот баги лезут изредка... В чем может быть дело? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2007, 01:48
|
|||
|---|---|---|---|
|
|||
функция PL/pgSQL выдает необъяснимую ошибку |
|||
|
#18+
Prejde chem predpolagat' chto-to neveroiatnoe, hochetsia sprosit': Vy uvereny chto pole field_c vo vseh tablitsah table_num_XXXXXXXX imeet strogo tip integer ? Prover'te: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2007, 11:02
|
|||
|---|---|---|---|
функция PL/pgSQL выдает необъяснимую ошибку |
|||
|
#18+
Уверен на 100%. Проверял руками/глазами. Похоже, все-таки действительно что-то странное происходит - функция, вызванная вручную с теми же аргументами, что привели к ошибке - отрабатывает прекрасно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.05.2007, 14:14
|
|||
|---|---|---|---|
|
|||
функция PL/pgSQL выдает необъяснимую ошибку |
|||
|
#18+
tier.ruУверен на 100%. Проверял руками/глазами. Похоже, все-таки действительно что-то странное происходит - функция, вызванная вручную с теми же аргументами, что привели к ошибке - отрабатывает прекрасно. Nu tut vazno ne povtoriat' tu je functsiu, a povtorit' posledovatelnost' 1) 1-yy vyzov f-ii, na kotorom preparil'is' plany 2) vyzov vashei f-ii Eto mojno poprobovat' otsledit' postaviv, log_statements =all i v log_prefix dobavit' Session ID, togda mojno uznat' na kakom vyzove proishodilo planirovanie functsii dlia dannoi sessii. A esli uje dumat' o tom, chto eto vozmojno bug v postgres'e, to mojno v src/pl/plpgsql/src/pl_exec.c tam gde vyvalivaetsia soobshenie (eto strochka 3713 v pl_exec.c ), dobavit' vydachu *typeid i expectedtypeid, chtoby poniat' hotia by, chto nepravilnoe, tip v preplanennoi functsii, ili v tip v vyzyvaemoi... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.05.2007, 00:43
|
|||
|---|---|---|---|
функция PL/pgSQL выдает необъяснимую ошибку |
|||
|
#18+
СергейКPrejde chem predpolagat' chto-to neveroiatnoe, hochetsia sprosit': Vy uvereny chto pole field_c vo vseh tablitsah table_num_XXXXXXXX imeet strogo tip integer ? Prover'te: Код: plaintext 1. Прошу прощения - немного соврал. Поле field_c в половине таблиц table_num_XXX имеет тип smallint, а в половине - integer. В first_table - тоже integer. НО, насколько я понимаю, из-за этого никаких проблем быть не может - типы-то совместимые. Кроме того, значения поля field_c НИКОГДА не выходит за размерность типа smallint. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
27.05.2007, 05:26
|
|||
|---|---|---|---|
|
|||
функция PL/pgSQL выдает необъяснимую ошибку |
|||
|
#18+
tier.ruПрошу прощения - немного соврал. Поле field_c в половине таблиц table_num_XXX имеет тип smallint, а в половине - integer. В first_table - тоже integer. НО, насколько я понимаю, из-за этого никаких проблем быть не может - типы-то совместимые. Кроме того, значения поля field_c НИКОГДА не выходит за размерность типа smallint. Nu... Nifiga oni ne sovmestimye... v dannom sluchae Postgres prosto formalno sravnivaet OID'y tipov, i esli oni raznye, to posylaet daleko... (ne pytaias' nichego cast'it') Tak chto esli hotite, chtoby u vas vse rabotalo, to v vashem zaprose: QUER="SELECT ..." cast'ite peremennuiu k tipu integer QUER := 'SELECT field_a, field_b, field_c::integer, field_d FROM table_num_' || NNN || ' WHERE url_field = ' || quote_literal(URL); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&mobile=1&tid=2005410]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 255ms |
| total: | 384ms |

| 0 / 0 |
