Postgresql
42702’列引用“id”不明確’用於返回表的 PL/pgSQL 函式的返回
這有效:
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;