Você precisa alterar o idioma de
sql para plpgsql se você quiser usar os recursos procedurais do PL/pgSQL. O corpo da função também muda. Esteja ciente de que todos os nomes de parâmetros são visíveis no corpo da função , incluindo todos os níveis de instruções SQL. Se você criar um conflito de nomenclatura, talvez seja necessário qualificar os nomes de coluna da tabela como este:
table.col , evitar confusão. Como você se refere aos parâmetros da função por referência posicional ($n ) de qualquer forma, acabei de remover os nomes dos parâmetros para fazê-lo funcionar. Finalmente,
THEN estava faltando no IF declaração - a causa imediata da mensagem de erro . Pode-se usar COALESCE para substituir
NULL valores. Mas isso só funciona se houver pelo menos uma linha resultante. COALESCE não pode corrigir "sem linha", só pode substituir NULL real valores. Existem várias maneiras de cobrir todos os
NULL casos. Em funções plpgsql :CREATE OR REPLACE FUNCTION point_total(integer, date, OUT result bigint)
RETURNS bigint AS
$func$
BEGIN
SELECT sum(p.points) -- COALESCE would make sense ...
INTO result
FROM picks p
WHERE p.user_id = $1
AND p.gametime > $2
AND p.points IS NOT NULL; -- ... if NULL values were not ruled out
IF NOT FOUND THEN -- If no row was found ...
result := 0; -- ... set to 0 explicitly
END IF;
END
$func$ LANGUAGE plpgsql;
Ou você pode incluir toda a consulta em um
COALESCE expressão em um SELECT externo . "Nenhuma linha" do SELECT interno resulta em um NULL na expressão. Trabalhe como SQL simples ou você pode envolvê-lo em uma função sql :CREATE OR REPLACE FUNCTION point_total(integer, date)
RETURNS bigint AS
$func$
SELECT COALESCE(
(SELECT sum(p.points)
FROM picks p
WHERE p.user_id = $1
AND p.gametime > $2
-- AND p.points IS NOT NULL -- redundant here
), 0)
$func$ LANGUAGE sql;
Resposta relacionada:
Com relação a conflitos de nomenclatura
Um problema foi o conflito de nomenclatura mais provável. Houve grandes mudanças na versão 9.0 . Cito as notas de versão :
Versões posteriores refinaram o comportamento. Em pontos óbvios, a alternativa certa é escolhida automaticamente. Reduz o potencial de conflitos, mas ainda existe. O conselho ainda se aplica no Postgres 9.3.