我正在處理兩個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;
它沒有給出錯誤信息的話,那運行正常,但它不會產生任何結果(它總是會引發異常消息),所以我想知道是否在中設置了錯誤查詢...
您忘了添加您提到的(逐字)錯誤消息。應該永遠在那裏。 –