这有效:
CREATE OR REPLACE FUNCTION sql_fun()
RETURNS TABLE (id UUID) AS $$
INSERT INTO foo DEFAULT VALUES
RETURNING id
$$ LANGUAGE SQL;
SELECT *
FROM sql_fun();
这不会:
CREATE OR REPLACE FUNCTION plpgsql_fun()
RETURNS TABLE (id UUID) AS $$
BEGIN
RETURN QUERY
INSERT INTO foo DEFAULT VALUES
RETURNING id;
END
$$ LANGUAGE PLpgSQL;
SELECT *
FROM plpgsql_fun();
这是 PL/pgSQL 中的错误吗?如何在保持返回类型不变的同时解决此问题?
解决方案是使用表的名称来限定所有与来自
RETURNING
的列具有相同名称的列:RETURNS TABLE
INSERTED INTO
如果表的名字很长并且有多个列,可以给名字起别名:
您甚至可以通过添加特殊的配置参数
#variable_conflict
来修复它,保持整个功能不变:但是,如果可能的话,最好通过表限定列名来实现,就像你自己发现的那样。在某些极端情况下,这并不容易:
有关的:
在早期版本中,Postgres 没有引发异常,而是默默地首选参数值而不是列:
并避免使用 CaMeL 对语言名称进行大小写
plpgsql
。引用时停止工作,这(不幸的是)是一种广泛存在的弊端。