Postgresql

42702’列引用“id”不明確’用於返回表的 PL/pgSQL 函式的返回

  • June 10, 2020

這有效:

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

CREATE OR REPLACE FUNCTION plpgsql_fun()
RETURNS TABLE (id UUID) AS $$
 BEGIN
   RETURN QUERY
   INSERT INTO foo DEFAULT VALUES
   RETURNING foo.id;
 END
$$ LANGUAGE PLpgSQL;

如果表的名字很長並且有多個列,可以給名字起別名:

CREATE OR REPLACE FUNCTION plpgsql_fun()
RETURNS TABLE (id UUID, foo INT, bar INT) AS $$
 BEGIN
   RETURN QUERY
   INSERT INTO table_with_a_very_long_name AS x DEFAULT VALUES
   RETURNING x.id, x.foo, x.bar;
 END
$$ LANGUAGE PLpgSQL;

引用自:https://dba.stackexchange.com/questions/268815