在 PL/pgSQL 中调用另一个函数内的函数

XVi*_*usX 8 sql postgresql date plpgsql

我定义了一个函数来总是给我下一个星期天的日期。它工作正常,这是代码:

CREATE FUNCTION nextSunday() RETURNS date AS $$
DECLARE
    dia_semana INT := CAST(EXTRACT(DOW FROM CURRENT_DATE)as INT);
    dia INT :=  7 - dia_semana;
BEGIN
    RETURN current_date + dia;
END;
$$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

我有另一个函数可以将数据转储到文件中,我需要在nextSunday()里面使用函数:

CREATE OR REPLACE FUNCTION popularTabelaPessoa() RETURNS VOID AS $$
BEGIN
COPY(SELECT pe.id, pe.fk_naturalidade, pe.fk_documentacao_pessoal, pe.nome, 
       pe.cpf, pe.data_nascimento, pe.sexo, pe.estado_civil, pe.nome_mae,
       pe.data_alteracao, pe.usuario_banco_alteracao,
       pe.usuario_aplicacao_alteracao
FROM fluxo_lt.banca ba
INNER JOIN corporativo.localidade lo
    ON ba.fk_municipio = lo.id
INNER JOIN fluxo_lt.agendamento_candidato ac
    ON ac.fk_banca = ba.id
INNER JOIN info_detran.processo as pr
    ON ac.fk_processo = pr.id
INNER JOIN info_detran.candidato as ca
    ON pr.fk_candidato = ca.id
INNER JOIN corporativo.pessoa as pe
    ON ca.fk_pessoa = pe.id
WHERE ba.data = (SELECT nextSunday())
ORDER BY lo.nome, pe.nome)

TO '/tmp/dump.sql';
END;
$$ LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

但它不起作用。字段ba.datadate,与nextSunday()函数的返回值类型相同。代码执行没有任何错误,但文件是空白的。如果我对日期进行硬编码,它就可以正常工作。已经尝试了一切(转换,将其放入变量,作为参数传递给函数)但到目前为止没有任何效果。

我正在使用 Postgres 9.3。

Erw*_*ter 8

首先,您的功能可以通过以下方式简单得多date_trunc()

CREATE FUNCTION next_sunday()
  RETURNS date
  LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
SELECT date_trunc('week', LOCALTIMESTAMP)::date + 6;
$func$
Run Code Online (Sandbox Code Playgroud)

PARALLEL SAFE 仅适用于 Postgres 9.6 或更高版本。

如果您必须考虑时区,请参阅:

如果“今天”是星期日,则上面将其返回为“下星期日”。
在这种情况下跳过一周:

CREATE FUNCTION next_sunday()
  RETURNS date
  LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
SELECT date_trunc('week', LOCALTIMESTAMP + interval '1 day')::date + 6;
$func$;
Run Code Online (Sandbox Code Playgroud)

db<>fiddle here
旧的sqlfiddle

或者直接使用date_trunc('week', LOCALTIMESTAMP)::date + 6,而不是函数。

接下来,简化调用:

CREATE FUNCTION next_sunday()
  RETURNS date
  LANGUAGE sql STABLE PARALLEL SAFE AS
$func$
SELECT date_trunc('week', LOCALTIMESTAMP + interval '1 day')::date + 6;
$func$;
Run Code Online (Sandbox Code Playgroud)

但是,这无法解释您COPY失败的原因。您确定查询返回任何行吗?您是否尝试过COPY没有函数包装器的手册?

您需要必要的权限,因为COPY TO
\copy在 psql 中可能是一个替代方案。