WSK*_*WSK 3 postgresql postgresql-9.6
此查询在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;
Run Code Online (Sandbox Code Playgroud)
但是当我将此查询包含在如下函数中时:
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$
Run Code Online (Sandbox Code Playgroud)
并通过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.
Run Code Online (Sandbox Code Playgroud)
知道这里有什么问题,我该如何解决?谢谢
从文档中,
36.4.9。SQL函数返回表
还有一种将函数声明为返回集合的方法,即使用语法RETURNS TABLE(columns)。这等效于使用一个或多个OUT参数,并将功能标记为返回SETOF记录(或SETOF,视情况而定为单个输出参数的类型)。该符号在SQL标准的最新版本中指定,因此比使用SETOF更可移植。
这意味着当您使用声明函数时RETURNS TABLE(jobnr character varying...,它jobnr是一个out参数。因此SELECT 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 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$
Run Code Online (Sandbox Code Playgroud)