我正在处理两个PostgreSQL同时安装:我的本地环境和真正的远程服务器。可悲的是服务器有一个旧版本(8.3.11),我的本地环境更新(9.4)。这两个PostgreSQL函数是否相同? (RETURNS TABLE和RETURNS SETOF)
我目前没有更新远程服务器的方法,因此我将一个运行良好的函数(它使用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;
它没有给出错误信息的话,那运行正常,但它不会产生任何结果(它总是会引发异常消息),所以我想知道是否在中设置了错误查询...
您忘了添加您提到的(逐字)错误消息。应该永远在那里。 –