2015-06-11 2 views
0

Я пытаюсь обновить поле во временной таблице, которую я создал.Postgresql: выполнить обновление во временной таблице в plpgsql не работает

Код для временной таблицы выглядит следующим образом:

CREATE OR REPLACE FUNCTION insertTable() 
RETURNS VOID AS $$ 
BEGIN 
execute 'create temporary table myTable (id INTEGER, value TEXT) on commit preserve rows'; 
execute 'insert into myTable values(1, NULL)'; 
end if; 
end; 
$$ LANGUAGE plpgsql; 

Далее я пытаюсь обновить значение, поданное с помощью следующей функции:

CREATE OR REPLACE FUNCTION setValue (msg TEXT) 
RETURNS VOID AS $$ 
BEGIN 
EXECUTE format('UPDATE myTable SET value = value || $1 WHERE id = '|| quote_literal(1))USING msg; 
END; 
$$ LANGUAGE plpgsql; 

Однако это не работает и поле значения остается пустым.

Я пробовал тот же код с уже существующей таблицей (не временный), и код работал должным образом.

Я искал документацию для разницы между обновлением временной и обычной таблицы, но не смог найти ее. Надеюсь, вы сможете мне помочь.

Заранее за вашу помощь.

Edit: отредактировали имя таблицы

+1

Вы вызывающий второй функцию через ту же физическую связь как первый? Если вы сделаете это с двух разных сеансов, то, конечно, второй не увидит данные, которые были вставлены первым. –

ответ

0

Проблема не связана с временной таблицей. Проблема в том, что столбец, который вы хотите обновить, фактически пуст. Вы пытаетесь обновить этот столбец, объединив значение столбца с другим текстом, но, поскольку само значение имеет значение null, конкатенированное значение также равно нулю.

Этот запрос:

SELECT null||'some text'; 

возвращает нуль. Также выдается сообщение об обновлении:

UPDATE xmlBuffer SET value = value || 'some text'; 

не обновляет строки, где фактическое содержимое равно null. Вы можете исправить эту проблему несколькими способами, в зависимости от ваших потребностей. В примере вы можете использовать COALESCE заявление во второй функции, используя пустую строку в качестве значения запасного варианта (кроме того, quote_literal и format заявления не нужно):

CREATE OR REPLACE FUNCTION setValue (msg TEXT) 
RETURNS VOID AS $$ 
BEGIN 
    EXECUTE 'UPDATE xmlBuffer SET value = COALESCE(value,'''') || $1 WHERE id = '|| 1 
    USING msg; 
END; 
$$ LANGUAGE plpgsql; 
+0

Это сработало, спасибо. Я не знал, что вы не можете объединить значение NULL с значением NOT NULL. Спасибо за вашу помощь. – user3906778