2014-02-14 184 views
3

我定義了一個函數,總是給我下個星期日的日期。它工作正常,這裏是代碼:在PL/PGSQL的另一個函數中調用一個函數

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 

我還有另外一個功能,數據轉儲到一個文件,我需要使用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 

但它無法正常工作。字段ba.datadate,與返回值爲nextSunday()函數的類型相同。代碼執行時沒有任何錯誤,但該文件是空白的。如果我硬編碼一個日期,它工作得很好。已經嘗試過所有東西(投射,將其放入一個變量,作爲參數傳遞給函數),但迄今爲止沒有任何工作。

我使用的是Postgres 9.3。

+0

您確定從函數返回的日期與您硬編碼的日期相同嗎?另外,我在第二段代碼中看不到'nextsunday'函數,它應該在哪裏使用? –

+0

@TomasGreif是的,函數返回一個日期類型。你可以測試一下,看看你自己。我編輯了這個問題,現在顯示nextSunday()函數,對此抱歉。 – XVirtusX

+0

我不是指類型,而是值(2014-02-16)。當你嘗試'(date_trunc('week',current_date)+ interval'1 week' - interval'1 day'):: date'而不是'(select nextsunday())'時會發生什麼?順便說一句。我認爲你不需要在select中使用'nextSunday()' - 'ba.data = nextsunday()'也可以工作 - 例如嘗試'select 1 where nextsunday()> current_date'。如果您使用硬編碼日期添加工作解決方案將會很好。 –

回答

3

首先,你的函數可以與date_trunc()更加簡單:

CREATE FUNCTION next_sunday() 
    RETURNS date AS 
$func$ 
SELECT date_trunc('week', now())::date + 6 
$func$ LANGUAGE sql 

如果「今天」是星期日,則返回爲「下週日」。此外,要跳到一個星期這種情況下:

CREATE FUNCTION next_sunday() 
    RETURNS date AS 
$func$ 
SELECT date_trunc('week', CURRENT_DATE + 1)::date + 6 
$func$ LANGUAGE sql 

-> SQLfiddle

你可能只是使用date_trunc('week', now())::date + 6,而不是拖放功能altogeher。

接下來,簡化呼叫:


CREATE OR REPLACE FUNCTION popular_tabela_pessoa() 
    RETURNS VOID AS 
$func$ 
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 
    JOIN corporativo.localidade   lo ON ba.fk_municipio = lo.id 
    JOIN fluxo_lt.agendamento_candidato ac ON ac.fk_banca = ba.id 
    JOIN info_detran.processo   pr ON ac.fk_processo = pr.id 
    JOIN info_detran.candidato   ca ON pr.fk_candidato = ca.id 
    JOIN corporativo.pessoa    pe ON ca.fk_pessoa = pe.id 
    WHERE ba.data = next_sunday() -- not: 
             
  
    (SELECT next_sunday()) 
   
-- or: WHERE ba.data = date_trunc('week', now())::date + 6 
    ORDER BY lo.nome, pe.nome) 
TO '/tmp/dump.sql'; 

END 
$func$ LANGUAGE plpgsql

然而,這不能解釋爲什麼你的副本失敗。你確定,你的查詢返回任何行嗎?你有沒有試過手冊COPY(沒有函數包裝)?