2
respostas

Criação de function no posgresql

Prezados, estou tentando criar uma function no postgresql utilizando, inclusive, campos calculados. Logo abaixo tem os campos importantes comentados (estão comentados pq sem eles eu consigo criar a function). Mas preciso desses campos. Como faço para incluí-los, após "descomentar"?

CREATE OR REPLACE FUNCTION bi.calculate_media_faturamento(IN parcompetenciainicial numeric, IN parcompetenciafinal numeric, IN parcnpj character varying, IN parsimples character varying, IN parreceita text, IN partributacao text)
  RETURNS TABLE(inscricaoid integer, numinscricao numeric, cnpj character varying, razaosocial character varying, competencia numeric, vlrbasecalculonfse numeric, vlrissnfse numeric, vlrissarrecadacao numeric, situacaosimples character varying, tp_receita text, tp_tributacao text) AS
$BODY$
BEGIN
    RETURN QUERY
    SELECT 
    tr.inscricaoid ,
    tr.numinscricao ,
    tr.cnpj ,
    tr.razaosocial ,
    tr.competencia ,
    tr.vlrbasecalculonfse ,
    tr.vlrissnfse ,
    tr.vlrissarrecadacao ,
    tr.situacaosimples R,
    tr.tp_receita ,
    tr.tp_tributacao
    
        --(SELECT COALESCE(SUM(a.vlrbasecalculonfse) / 12, 0) 
        -- FROM tr_relatorio_comparativo_iss a
       --  WHERE CAST(a.competencia || '01' AS DATE) >= (CAST(parCompetenciaFinal || '01' AS DATE) - INTERVAL '12 month')
        --   AND CAST(a.competencia || '01' AS DATE) <= (CAST(parCompetenciaFinal || '01' AS DATE) - INTERVAL '1 month')
         --  AND (a.inscricaoid = tr.inscricaoid)
        --   AND (a.cnpj = parCNPJ OR parCNPJ = 'Todos')) AS mediafaturamento,
        
      --  (SELECT COALESCE(SUM(a.vlrissarrecadacao) / 12, 0)
       --  FROM tr_relatorio_comparativo_iss a
       --  WHERE CAST(a.competencia || '01' AS DATE) >= (CAST(parCompetenciaFinal || '01' AS DATE) - INTERVAL '12 month')
         --  AND CAST(a.competencia || '01' AS DATE) <= (CAST(parCompetenciaFinal || '01' AS DATE) - INTERVAL '1 month')
        --   AND (a.inscricaoid = tr.inscricaoid)
       --    AND (a.cnpj = parCNPJ OR parCNPJ = 'Todos')) AS mediaarrecadacao,
       --CASE
       -- WHEN tr.vlrissarrecadacao = 0 THEN 'EM ABERTO'
        --WHEN tr.vlrissnfse = tr.vlrissarrecadacao THEN 'QUITADO'
        --WHEN tr.vlrissnfse < tr.vlrissarrecadacao THEN 'PAGO A MENOR'
      -- END AS pagamento
    FROM tr_relatorio_comparativo_iss tr
   WHERE tr.competencia BETWEEN parCompetenciaInicial AND parCompetenciaFinal
  AND (tr.cnpj = parCNPJ OR parCNPJ = 'Todos')
  AND (tr.situacaosimples = parSimples OR parSimples = 'Todos')
   AND (tr.tp_receita = parReceita OR parReceita = 'Todos')
  AND (tr.tp_tributacao = parTributacao OR parTributacao = 'Todos')
   ;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
2 respostas

Oi Fernanda, como vai?

Para incluir os campos calculados na sua função PostgreSQL, você pode seguir os seguintes passos:

  1. Descomente os Campos Calculados: Remova os comentários dos trechos que calculam mediafaturamento, mediaarrecadacao e pagamento.

  2. Ajuste a Cláusula SELECT: Dentro da cláusula SELECT da sua consulta principal (RETURN QUERY SELECT ...), adicione os campos calculados conforme os trechos que você descomentou.

  3. Ajuste dos Subqueries: Certifique-se de que os subqueries para mediafaturamento e mediaarrecadacao estão corretamente alinhados e calculados usando a sintaxe apropriada do PostgreSQL. Isso inclui a utilização de funções agregadas como SUM() e COALESCE() para lidar com valores nulos.

  4. Verifique as Condições de Filtragem: Garanta que as condições utilizadas nos subqueries e na consulta principal (WHERE) estão corretamente alinhadas com os parâmetros passados para a função (parCompetenciaInicial, parCompetenciaFinal, parCNPJ, parSimples, parReceita, parTributacao).

  5. Teste a Função: Após realizar esses ajustes, teste a função para garantir que os campos calculados estão sendo corretamente calculados e retornados junto com os demais campos da consulta.

  6. Performance e Otimização: Considere a performance da função, especialmente se estiver lidando com grandes volumes de dados. Ajuste o índice das tabelas conforme necessário para otimizar o desempenho das consultas.

Espero ter ajudado, Fernanda! Bons estudos.

Muito Obrigada Larissa! Seguirei os procedimentos indicados!