此查询在postgress上运行得非常好,并返回我正在寻找的2列:
SELECT w.jobnr, w.ordernr
FROM
(SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=1) AS W
LEFT OUTER JOIN
(SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=2) AS P
ON W.Jobnr=P.Jobnr;
但是当我将此查询包含在函数中时:
CREATE OR REPLACE FUNCTION userdata.test3()
RETURNS TABLE(jobnr character varying, ordernr character varying)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT w.jobnr, w.ordernr
FROM
(SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=1) AS W
LEFT OUTER JOIN
(SELECT jobnr, ordernr FROM userdata.WIP_Data WHERE Year=2015 AND period=2) AS P
ON W.Jobnr=P.Jobnr;
END;
$function$
并按SELECT * from userdata.test3()
执行
我收到了以下错误:
ErrorCode: -2147467259
Severity: ERROR, Code: 42702, Line: 1076, Position:
ErrorMessage: column reference "jobnr" is ambiguous
Detail: It could refer to either a PL/pgSQL variable or a table column.
知道这里有什么问题,我该如何解决?感谢
答案 0 :(得分:3)
36.4.9。 SQL函数返回表
还有另一种方法可以将函数声明为返回一个集合 是使用语法RETURNS TABLE(columns)。这相当于 使用一个或多个OUT参数并将该功能标记为 返回SETOF记录(或SETOF单个输出参数'类型,如 适当)。此表示法在SQL的最新版本中指定 标准,因此可能比使用SETOF更便携。
这意味着当您使用RETURNS TABLE(jobnr character varying...
声明该函数时,jobnr
是一个out参数。因此SELECT jobnr ...
含糊不清。
尝试使用select:
中的表为别名声明函数CREATE OR REPLACE FUNCTION userdata.test3()
RETURNS TABLE(jobnr character varying, ordernr character varying)
LANGUAGE plpgsql
AS $function$
BEGIN
RETURN QUERY
SELECT w.jobnr, w.ordernr
FROM
(SELECT wip.jobnr, wip.ordernr FROM userdata.WIP_Data as wip WHERE Year=2015 AND period=1) AS W
LEFT OUTER JOIN
(SELECT wip.jobnr, wip.ordernr FROM userdata.WIP_Data as wip WHERE Year=2015 AND period=2) AS P
ON W.Jobnr=P.Jobnr;
END;
$function$
答案 1 :(得分:1)
可能是bug
混淆了返回的clausule
RETURNS TABLE(jobnr character varying, ordernr character varying)
带参数声明。
我知道jobnr不是参数(它是返回记录集的列名)。但是,对于Postgres来说,这个问题很困惑。
在RETURNS
clausule
@Andreas是对的!但这是一个无意义的功能。
答案 2 :(得分:0)
对于像我一样没有选择使用表标识符来区分列和 RETURNS
子句中的列的人,将函数的 LANGUAGE
从 plpgsql
切换到 { {1}}(并根据该更改调整查询)删除了此“功能”。
在我的特定情况下,冲突在于 sql
上的列在 RETURNING
之后的明确命名
我想要一个在 INSERT
期间有效但尚未找到的解决方案。