2014-02-14 8 views
3

필자는 항상 다음 주일의 날짜를 알려주는 함수를 정의했습니다. 그것은 여기에, 잘 작동 코드입니다 : 내가 파일에 데이터를 덤프하는 또 다른 기능을 가지고 있고 내부 nextSunday() 기능을 사용할 필요가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 

:

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)입니다. '(select nextsunday()) 대신'(date_trunc ('week, current_date) + interval'1 week '- interval'1 day ') :: date'을 시도하면 어떻게됩니까? Btw. 나는 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 

, 그것은 "다음 일요일"로 반환됩니다. 또한,이 경우 일주 건너 뛸 수 있습니다 : 당신은 그냥 대신 date_trunc('week', now())::date + 6을 사용하고 기능 altogeher을 드롭 할 수

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

-> SQLfiddle

. 당신의 COPY가 실패하는 이유


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을 사용해 보셨습니까?

관련 문제