Функция PL / pgSQL не будет работать правильно вне pgAdmin - PullRequest
0 голосов
/ 04 января 2019

Я создал функцию PL / pgSQL в PostgreSQL 10.4, используя pgAdmin.Он возвращает запрос и обновляет записи в той же таблице.Вызывается в pgAdmin, работает как положено.При запуске из внешнего кода таблица возвращается, но обновления никогда не запускаются.Хотите знать, связано ли это с тем, как я написал функцию?

CREATE OR REPLACE FUNCTION report()
RETURNS TABLE(id text, t1 text, t2 text)
LANGUAGE 'plpsql'

AS $BODY$
DECLARE
rec RECORD;

BEGIN
RETURN QUERY
SELECT id,
name AS t1,
data AS t2
FROM table1
WHERE status IS NULL;

IF FOUND THEN
FOR rec IN SELECT id
FROM table1
WHERE status IS NULL
LOOP
UPDATE table1 SET val=val+1
WHERE id=rec.id;
END IF;

RETURN;
END
$BODY$;

РЕДАКТИРОВАТЬ:

Спасибо за ответы.У меня больше нет никого, кто мог бы помочь взглянуть, так что это было очень полезно при устранении неполадок в том, что происходило.

Была настолько зациклена на моей функции PL / pgSQL, что возникла проблема, я упустил из виду мою внешнюю программуфункция.Ошибка пользователя с моей стороны.Переместив свое ОБНОВЛЕНИЕ выше моего ВЫБРАТЬ, я заметил, что моя программа видела ОБНОВЛЕНИЕ.Я забыл ЗАВЕРШИТЬ обновления обратно в базу данных в моей внешней программе, поэтому таблица никогда не обновлялась.Добавлен коммит и хорошо для.

1 Ответ

0 голосов
/ 04 января 2019

Похоже, что вы можете заменить всю функцию этим простым, намного более дешевым UPDATE запросом и предложением RETURNING:

UPDATE table1
SET    val = val + 1
WHERE  status IS NULL
RETURNING id, name AS t1, data AS t2;

Если могут быть условия гонкиОбратите внимание:

Вы можете выполнить этот запрос как есть, без функции-оболочки.Если вам нужна функция-оболочка, добавьте RETURN QUERY для непосредственного возврата результатов.Пример кода:

...