Postgresql:对 plpgsql 中的临时表执行更新不起作用

Posted

技术标签:

【中文标题】Postgresql:对 plpgsql 中的临时表执行更新不起作用【英文标题】:Postgresql: execute update on a temporary table in plpgsql is not working 【发布时间】:2015-06-11 14:47:26 【问题描述】:

我正在尝试更新我创建的临时表中的字段。

临时表的代码如下所示:

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;

但是它不起作用并且值字段保持为空。

我在已经存在的表(不是临时表)上尝试了相同的代码,并且代码按预期工作。

我在文档中搜索了更新临时表和普通表之间的区别,但找不到任何内容。 我希望你能帮我解决这个问题。

提前感谢您的帮助。

编辑:编辑表名

【问题讨论】:

您是否通过与第一个相同的物理连接来调用第二个函数?如果您从两个不同的会话中执行此操作,那么第二个会话当然不会看到第一个插入的数据 【参考方案1】:

该问题与临时表无关。问题是您要更新的列实际上是空的。您尝试通过将列的值与另一个文本连接来更新此列,但是,由于该值本身为空,因此连接的值也为空。

这个查询:

SELECT null||'some text';

返回空值。还有这个更新声明:

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

不会更新实际内容为空的行。您可以根据需要通过多种方式解决此问题。例如,您可以在第二个函数中使用COALESCE 语句,使用空字符串作为备用值(此外,quote_literalformat 语句不是必需的):

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;

【讨论】:

成功了,谢谢。我不知道您不能将 NULL 值与 NOT NULL 值连接起来。感谢您的帮助。

以上是关于Postgresql:对 plpgsql 中的临时表执行更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 9.2 中分析 plpgsql 函数

检查 plpgsql 中的当前日志记录级别

PostgreSQL v12.6 中的 PLpgSQL INSERT-RETURNING-INTO 错误?

sql 用于将ftp日志存储到PostgreSQL中的表的SQL和PLPGSQL代码(来自rsyslog)

PostgreSQL:在 plpgsql 函数中回滚事务?

对于表中的行,将行保存在临时表中以在 plpgsql 的选择查询中使用其数据