0 / 0 / 0
Регистрация: 14.04.2009
Сообщений: 5
1

commit внутри функции plpgsql

14.05.2009, 13:24. Показов 9156. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Столкнулся с проблемой промежуточного commit внутри функции.
Есть функция внутри которой огромный цикл по записям в таблице. В цикле выполняется множество insert и update других таблиц. Функция выполняется очень долгое время. Хотелось бы видеть прогресс. Вот поэтому хотел на каждом шаге цикла сделать commit, чтобы видеть как идет выполнение. Поставил commit в самый конец цикла и запустил на выполнение. Сразу же выдает ошибку ERROR: SPI_execute_plan failed executing query "COMMIT": SPI_ERROR_TRANSACTION

Подскажите как решить проблему
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2009, 13:24
Ответы с готовыми решениями:

Plpgsql как пользоваться
в общем, парсю значение посредством плпскл, получилось пока такое. синатксис нов, чувссвтую что...

Запрос по plpgsql с курсором
Здравствуйте! Как и все студенты, делаю курсовую работу в последнюю ночь :) Но с этим запросом,...

Plpgsql . вставка данных из файла
Добрый день! Подскажите пожалуйста, как можно выбрать значение из файла (excel), чтобы...

Вызов функции внутри другой функции с передачей локальной переменной по ссылке
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include <iostream> using...

1
Alex_Ora
10.11.2009, 16:15 2
В принципе, слишком частый commit в цикле веде к ошибке ORA-1555.

Чем выше частота commit-ов, тем скорее extent в rollback segment-е будет очищен для новой транзакции, что и приведет к ошибке ORA-1555.

Идея решения проста :

SQL
1
2
3
4
    FOR records IN my_cursor LOOP
           ...do SOME stuff...
           COMMIT;
        END LOOP;
... на ...

SQL
1
2
3
4
5
6
7
        FOR records IN my_cursor LOOP
           ...do SOME stuff...
           i := i+1;
           IF MOD(i, 10000) THEN    -- Commit every 10000 records
              COMMIT;
           END IF;
        END LOOP;

Если и это не поможет, надо увеличить rollback segment-ы.
10.11.2009, 16:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2009, 16:15
Помогаю со студенческими работами здесь

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?)
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении...

Почему выделенная внутри функции память удаляется после возврата функции? Это можно исправить?
Вот пример функции, которая выделяет память под переменную, объявленную за её пределами: void...

Функция ЕСЛИ внутри функции ИЛИ внутри ЕСЛИ
Здравствуйте! Помогите решить, пожалуйста, данную задачу. ...

Добавление Commit
Здравствуйте! Помоги мне, пожалуйста! Я нашел программу на GitHub, скачал ее код, полностью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru