Bom dia, Chiappa. Segue abaixo o código da minha função. O insert seria a linha comentada. Sei que o código é de péssima qualidade, mas é o que resolveu pra mim , como autodidata curioso. É uma Aging List do contas a pagar contra receber. Só que o cliente quer um histórico dessa aging list.
CREATE OR REPLACE FUNCTION edu_fluxo(DTINICIAL DATE,DTFINAL DATE, intervalos varchar, vencidos varchar) RETURN TABELA_edu_FLUXO IS CURSOR CR_FLUXO IS select vencidos AS VENCIDO , intervalos AS INTERVALO , 0 AS REC_VERBA_QTD , 0 REC_VERBA_VALOR ,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('DH', 'D' ))REC_AVISTA_QTD ,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('CH', 'CHC', 'CHP','CHV' ))REC_CHEQUES_QTD ,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('237', 'C' ))REC_TITULOS_QTD ,(SELECT COUNT(*) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('237','C','CH','CHC','DH','D','CHP','CHV'))REC_TOTAL_QTD ,(SELECT COUNT(*) FROM pagar WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAGTO IS NULL AND TIPOLANC = 'P' )PAG_PROV_QTD ,(SELECT COUNT(*) FROM pagar WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAGTO IS NULL AND TIPOLANC = 'C' )PAG_CONF_QTD ,(SELECT COUNT(*) FROM pagar WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAGTO IS NULL )PAG_TOTAL_QTD ,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('DH','D' ))REC_AVISTA_VALOR ,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('CH','CHC','CHP','CHV' ))REC_CHEQUES_VALOR ,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('237','C' ))REC_TITULOS_VALOR ,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('237','C','CH','CHC','DH','D','CHP','CHV'))REC_TOTAL_VALOR ,(SELECT nvl(SUM(VALOR),0) FROM pagar WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAGTO IS NULL AND TIPOLANC = 'P' )PAG_PROV_VALOR ,(SELECT nvl(SUM(VALOR),0) FROM pagar WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAGTO IS NULL AND TIPOLANC = 'C' )PAG_CONF_VALOR ,(SELECT nvl(SUM(VALOR),0) FROM pagar WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAGTO IS NULL )PAG_TOTAL_VALOR ,(SELECT nvl(SUM(VALOR),0) FROM receber WHERE dtvenc BETWEEN DTINICIAL AND DTFINAL AND DTPAG IS NULL AND CODCOB IN ('237','C','CH','CHC','DH','D','CHP','CHV')) / (SELECT nvl(SUM(VALOR),0) FROM receber WHERE DTPAG IS NULL AND CODCOB IN ('237','C','CH','CHC','DH','D','CHP','CHV')) * 100 AS REC_TOTAL_PERC , 0 AS SALDO from DUAL ; RETORNO TABELA_edu_FLUXO; BEGIN RETORNO := TABELA_edu_FLUXO(); FOR ITEM IN CR_FLUXO LOOP RETORNO.EXTEND; RETORNO(RETORNO.COUNT) := TIPO_edu_FLUXO( VENCIDO => NULL, INTERVALO => NULL, REC_VERBA_QTD => NULL, REC_VERBA_VALOR => NULL, REC_AVISTA_QTD => NULL, REC_AVISTA_VALOR => NULL, REC_CHEQUES_QTD => NULL, REC_CHEQUES_VALOR => NULL, REC_TITULOS_QTD => NULL, REC_TITULOS_VALOR => NULL, REC_TOTAL_QTD => NULL, REC_TOTAL_VALOR => NULL, REC_TOTAL_PERC => NULL, PAG_PROV_QTD => NULL, PAG_PROV_VALOR => NULL, PAG_CONF_QTD => NULL, PAG_CONF_VALOR => NULL, PAG_TOTAL_QTD => NULL, PAG_TOTAL_VALOR => NULL, SALDO => NULL); RETORNO(RETORNO.COUNT).VENCIDO :=ITEM.VENCIDO; RETORNO(RETORNO.COUNT).INTERVALO :=ITEM.INTERVALO; RETORNO(RETORNO.COUNT).REC_VERBA_QTD :=ITEM.REC_VERBA_QTD; RETORNO(RETORNO.COUNT).REC_VERBA_VALOR :=ITEM.REC_VERBA_VALOR; RETORNO(RETORNO.COUNT).REC_AVISTA_QTD :=ITEM.REC_AVISTA_QTD; RETORNO(RETORNO.COUNT).REC_AVISTA_VALOR :=ITEM.REC_AVISTA_VALOR; RETORNO(RETORNO.COUNT).REC_CHEQUES_QTD :=ITEM.REC_CHEQUES_QTD; RETORNO(RETORNO.COUNT).REC_CHEQUES_VALOR :=ITEM.REC_CHEQUES_VALOR; RETORNO(RETORNO.COUNT).REC_TITULOS_QTD :=ITEM.REC_TITULOS_QTD; RETORNO(RETORNO.COUNT).REC_TITULOS_VALOR :=ITEM.REC_TITULOS_VALOR; RETORNO(RETORNO.COUNT).REC_TOTAL_QTD :=ITEM.REC_TOTAL_QTD; RETORNO(RETORNO.COUNT).REC_TOTAL_VALOR :=ITEM.REC_TOTAL_VALOR; RETORNO(RETORNO.COUNT).REC_TOTAL_PERC :=ITEM.REC_TOTAL_PERC; RETORNO(RETORNO.COUNT).PAG_PROV_QTD :=ITEM.PAG_PROV_QTD; RETORNO(RETORNO.COUNT).PAG_PROV_VALOR :=ITEM.PAG_PROV_VALOR; RETORNO(RETORNO.COUNT).PAG_CONF_QTD :=ITEM.PAG_CONF_QTD; RETORNO(RETORNO.COUNT).PAG_CONF_VALOR :=ITEM.PAG_CONF_VALOR; RETORNO(RETORNO.COUNT).PAG_TOTAL_QTD :=ITEM.PAG_TOTAL_QTD; RETORNO(RETORNO.COUNT).PAG_TOTAL_VALOR :=ITEM.PAG_TOTAL_VALOR; RETORNO(RETORNO.COUNT).SALDO :=ITEM.SALDO; --INSERT INTO edu_FLUXO_LOG ( VENCIDO,INTERVALO) VALUES ( ITEM.VENCIDO, ITEM.INTERVALO); --insert into edu_log_fluxo select * from table (TIPO_edu_FLUXO); END LOOP; RETURN RETORNO; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001, 'Erro motivo: ' || SQLERRM || '. Linha: ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); END; --Perdomo 12/09/2018 / -- End of DDL Script for Function edu.edu_FLUXO On Mon, Sep 24, 2018 at 3:19 PM jlchia...@yahoo.com.br [oracle_br] < oracle_br@yahoogrupos.com.br> wrote: > > > Bom, embora eu NÂO USE ISSO (entre outros MUITOS limitadores, vc está > basicamente trabalhando com ARRAYS EM MEMÓRIA - Obviamente arrays esses > sujeitos às limitações de PGA do Oracle -, E obviamente Também ao fato de > que a própria linguagem SQL não foi completamente instrumentada pra > trabalhar com isso), Sei que pra vc poder fazer INSERT INTO tabelareal > (SELECT * FROM objecttypetable), antes de mais nada vc tem que fazer o > SELECT : se a sua versão for no mínimo 12c (cfrme indicado em > https://stackoverflow.com/questions/5165580/how-to-use-a-table-type-in-a-select-from-statement > e em > https://oracle-base.com/articles/12c/using-the-table-operator-with-locally-defined-types-in-plsql-12cr1) > em princípio vc pode usar o operador TABLE, tipo SELECT * FROM > TABLE(nomedasuaTABLEOFtype) .... SE a sua versão (a qual vc Não nos Diz > qual é) for Inferior à 12c, Provavelmente vc vai ter que usar Object Types > e Nested Tables, vide > https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:774225935270 > ..... > > []s > > Chiappa > > OBS : caso ainda restem dúvidas, manda pra gente a versão EXATA do > RDBMS, os CREATE TABLEs e os INSERTs pra gente ter uma massinha de testes, > E explica em detalhes a lógica que vc quer implementar, que a gente pode > tentar palpitar mais em cima e/ou escrever código de exemplo mais > específico... > > -- Eduardo Perdomo Consultor de Implantação Grupo PC Sistemas - www.grupopc.com.br (21) 6845-8592 panc...@gmail.com eduardo.perd...@pcinformatica.com.br Blog: eduardo.perdomo.nom.br