我正在同时处理两个PostgreSQL安装:我的本地环境和真实的远程服务器。不幸的是,服务器有一个旧版本(8.3.11),而我的本地环境是新版本(9.4)。
目前我没有办法更新远程服务器,所以我正在将一个在9.4中运行良好的函数(它使用
但是,虽然本地环境函数能够良好地工作并且给出好的结果,但远程函数总是没有结果(使用完全相同的表!)
那么,这两个函数完全等效吗?
本地环境的新函数如下:
目前我没有办法更新远程服务器,所以我正在将一个在9.4中运行良好的函数(它使用
RETURNS TABLE
)转换为一个应该可以在8.3.11中正常运行的函数(它应该使用RETURNS SETOF
)。但是,虽然本地环境函数能够良好地工作并且给出好的结果,但远程函数总是没有结果(使用完全相同的表!)
那么,这两个函数完全等效吗?
本地环境的新函数如下:
CREATE OR REPLACE FUNCTION pra2.GetGamesOnDate(date)
RETURNS TABLE (game_date date, is_home varchar, is_away varchar) AS $$
BEGIN
RETURN QUERY
SELECT g.game_date, p1.team_name AS plays_at_home, p2.team_name AS plays_away
FROM pra2.game g
JOIN pra2.team p1 ON g.is_home = p1.team_id
JOIN pra2.team p2 ON g.is_away = p2.team_id
WHERE g.game_date = $1;
IF NOT FOUND THEN
RAISE EXCEPTION 'No hay partidos para la fecha %.', $1;
END IF;
RETURN;
END
$$
LANGUAGE plpgsql;
下面是我修改过的使用 SETOF
的函数
CREATE TYPE return_type AS
(game_date date,
is_home varchar,
is_away varchar);
CREATE OR REPLACE FUNCTION pra2.GetGamesOnDate(date)
RETURNS SETOF return_type AS $$
DECLARE
_rec return_type;
BEGIN
RETURN QUERY
SELECT g.game_date, p1.team_name AS plays_at_home, p2.team_name AS plays_away
FROM pra2.game g
JOIN pra2.team p1 ON g.is_home = p1.team_id
JOIN pra2.team p2 ON g.is_away = p2.team_id
WHERE g.game_date = $1;
IF NOT FOUND THEN
RAISE EXCEPTION 'No hay partidos para la fecha %.', $1;
END IF;
RETURN next _rec;
END
$$
LANGUAGE plpgsql;
这段代码没有任何错误提示,程序可以正常运行,但是没有返回任何结果(总是引发异常消息),因此我想知道在 SETOF
查询中是否设置有误...