Jump to content
alextdssouza

Cursor para Juntar duas tabelas uma abaixo da outro pelo id com hierarquia pai e filho

Recommended Posts

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By igor.js167
      Boa tarde,
      Estou enfrentando um problema recorrente nas minhas queries, já tentei algumas alternativas encontradas aqui, sem sucesso.
       
      Tenho o seguinte select:
      select avaliacao.dt_liberacao, avaliacao.cd_pessoa_fisica, nome.nm_pessoa_fisica NOME_PCT, decode(diag.qt_resultado,871,'Desnutrição grave',872,'Desnutrição moderada',873,'Desnutrição leve', 874,'Eutrofia',875,'Sobrepeso',876,'Obesidade') from med_avaliacao_paciente avaliacao, pessoa_fisica nome, med_avaliacao_result diag where diag.nr_seq_item = 1266 and diag.nr_seq_avaliacao = avaliacao.nr_sequencia and avaliacao.cd_pessoa_fisica = nome.cd_pessoa_fisica and avaliacao.dt_liberacao is not null and ie_situacao = 'A' O que quero é trazer apenas o último registro por pessoa, um das alternativas que tentei foi dada em outro tópico pelo moderador Motta, incluindo no where o código:
      and avaliacao.dt_liberacao = (select max(avaliacao2.dt_liberacao) from med_avaliacao_paciente avaliacao2 where avaliacao.cd_pessoa_fisica = avaliacao2.cd_pessoa_fisica) Porém esse select só retorna um resultado...
       
      Realmente preciso entender como funciona essa lógico, porque tenho vários selects semelhantes que preciso retirar os resultados "repetidos"
    • By fabissilva
      desenvolvi em PL / SQL uma procedure que envia email que está funcionando perfeitamente. Porém foi mudado o servidor de email para Gmail, que requer autenticação e o tipo de conexão é SSL. Poderiam me ajudar com essas alterações?
      A versão do banco de dados é o 11.


      CREATE OR REPLACE PROCEDURE PRC_JUN_SEND_MAIL
      (
      TO_NAME VARCHAR2,
      SUBJECT VARCHAR2,
      MESSAGE VARCHAR2
      )
      IS
      L_BODY VARCHAR2(32767);

      L_MAILHOST VARCHAR2(64) := ''smtp.gmail.com'';
      P_USERNAME_ VARCHAR2(50) := ''admin@jun.net'';
      P_PASSWORD_ VARCHAR2(50) := ''***********'';
      L_DE VARCHAR2(64) := ''Remetente'';
      L_FROM VARCHAR2(64) := ''admin@jun.net'';
      l_port VARCHAR(7) := ''587'';
      L_MAIL_CONN UTL_SMTP.CONNECTION;


      BEGIN
      L_MAIL_CONN := UTL_SMTP.OPEN_CONNECTION(L_MAILHOST,l_port);
      Dbms_Output.Put_Line (''apos conectar'');
      UTL_SMTP.HELO(L_MAIL_CONN, L_MAILHOST);

      Dbms_Output.Put_Line (''hello'');
      UTL_SMTP.COMMAND (L_MAIL_CONN, ''AUTH LOGIN'');
      Dbms_Output.Put_Line (''AUTH LOGIN'');
      UTL_SMTP.COMMAND (L_MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2(
      UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_USERNAME_))));
      UTL_SMTP.COMMAND (L_MAIL_CONN, UTL_RAW.CAST_TO_VARCHAR2( UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(P_PASSWORD_))));
      UTL_SMTP.MAIL(L_MAIL_CONN, L_FROM);
      UTL_SMTP.RCPT(L_MAIL_CONN, TO_NAME);

      UTL_SMTP.OPEN_DATA(L_MAIL_CONN);

      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''FROM:'' ||L_DE||''<''|| L_FROM|| ''>'' || UTL_TCP.CRLF));
      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''TO:'' ||TO_NAME||UTL_TCP.CRLF));
      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''SUBJECT:'' ||SUBJECT||UTL_TCP.CRLF));
      UTL_SMTP.WRITE_RAW_DATA( L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(''CONTENT-TYPE: TEXT/HTML; CHARSET=ISO-8859-1''||UTL_TCP.CRLF));
      UTL_SMTP.WRITE_DATA(L_MAIL_CONN, '' ''||UTL_TCP.CRLF);

      UTL_SMTP.WRITE_RAW_DATA(L_MAIL_CONN, UTL_RAW.CAST_TO_RAW(UTL_TCP.CRLF||MESSAGE));

      UTL_SMTP.CLOSE_DATA(L_MAIL_CONN);

      UTL_SMTP.QUIT(L_MAIL_CONN);
      END;
    • By alextdssouza
      Estou com o seguinte problema fiz alguns cursores para exportar algumas informações para texto, porém está demorando mais de 2 horas para exportar 4 mil linhas, o problema aconteceu 
      depois de ter incluído os registros de nível 3 e 4 algumas dessas tabelas estão sem informação não sei se seria esse o problema, todas as minhas tabelas estão indexadas. 
      Gostaria de saber se alguém pode me ajudar a otimizar esse tempo ou me informar qual seria a melhor maneira de fazer isso, sem o nível 3 e 4 levava 5 min para gerar o mesmo resultado, agora leva mais de 2hs. Abaixo Segue o Cursor. Obrigado!
       
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
      SET SERVEROUTPUT ON;
      DECLARE
        MEU_ARQUIVO UTL_FILE.FILE_TYPE;
        
          CURSOR CR_0000 IS SELECT * FROM TBL_EFD_ICMS_0000;     
          CURSOR CR_C100 IS SELECT * FROM TBL_EFD_ICMS_C100;
          CURSOR CR_C110 IS SELECT * FROM TBL_EFD_ICMS_C110;
          CURSOR CR_C111 IS SELECT * FROM TBL_EFD_ICMS_C111;
          
          REG_0000 CR_0000%ROWTYPE; 
          REG_C100 CR_C100%ROWTYPE; 
          REG_C110 CR_C110%ROWTYPE; 
          REG_C111 CR_C111%ROWTYPE; 

      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
      BEGIN
          MEU_ARQUIVO := UTL_FILE.FOPEN('DIRETORIO', 'SAIDAS_NEW.txt', 'w');
              
          OPEN CR_0000; -- nivel 1
              LOOP
                  FETCH CR_0000 INTO REG_0000;
                  EXIT WHEN CR_0000%NOTFOUND;
                  UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_0000.REG 
                  ||'|'||REG_0000.COD_VER 
                  ||'|'||REG_0000.DT_INI 
                  ||'|'||REG_0000.DT_FIN 
                  ||'|'||REG_0000.CNPJ 
                  ||'|'||REG_0000.IND_ATIV ||'|');
                  
                  OPEN CR_C100; -- nivel 2
                      LOOP
                          FETCH CR_C100 INTO REG_C100;
                          EXIT WHEN CR_C100%NOTFOUND;
                          IF  REG_C100.ID_0000 = REG_0000.ID_0000 THEN
                              UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_C100.REG 
                              ||'|'||REG_C100.SER
                              ||'|'||REG_C100.NUM_DOC
                              ||'|'||REG_C100.CHV_NFE
                              ||'|'||REG_C100.DT_DOC
                              ||'|'||REG_C100.DT_E_S
                              ||'|'||REG_C100.VL_DOC
                              ||'|'||REG_C100.VL_COFINS_ST ||'|');
                          END IF;
                          
                          OPEN CR_C110; -- nivel 3
                              LOOP
                                  FETCH CR_C110 INTO REG_C110;
                                  EXIT WHEN CR_C110%NOTFOUND;
                                  IF  REG_C110.ID_0000 = REG_0000.ID_0000 AND
                                      REG_C110.ID_C100 = REG_C100.ID_C100 THEN
                                      UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_C110.REG 
                                      ||'|'||REG_C110.COD_INF
                                      ||'|'||REG_C110.TXT_COMPL ||'|');
                                  END IF; 
                          
                                  OPEN CR_C111; -- nivel 4
                                      LOOP
                                          FETCH CR_C111 INTO REG_C111;
                                          EXIT WHEN CR_C111%NOTFOUND;
                                          IF  REG_C111.ID_0000 = REG_0000.ID_0000 AND
                                              REG_C111.ID_C100 = REG_C100.ID_C100 AND 
                                              REG_C111.ID_C110 = REG_C110.ID_C110 THEN
                                              UTL_FILE.PUT_LINE(MEU_ARQUIVO,'|'||REG_C111.REG 
                                              ||'|'||REG_C111.COD_INF
                                              ||'|'||REG_C111.TXT_COMPL ||'|');
                                          END IF;
                                      END LOOP;
                                  CLOSE CR_C111;
                                  
                              END LOOP;
                          CLOSE CR_C110;
                          
                      END LOOP;
                  CLOSE CR_C100;
                  
              END LOOP;
          CLOSE CR_0000;
      DBMS_OUTPUT.PUT_LINE('Arquivo gerado com sucesso.');
      --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
      Exception
      WHEN UTL_FILE.INVALID_OPERATION THEN
      Dbms_Output.Put_Line('Operação inválida no arquivo.');
      UTL_FILE.FCLOSE(MEU_ARQUIVO);
      WHEN UTL_FILE.WRITE_ERROR THEN
      Dbms_Output.Put_Line('Erro de gravação no arquivo.');
      UTL_FILE.FCLOSE(MEU_ARQUIVO);
      WHEN UTL_FILE.INVALID_PATH THEN
      Dbms_Output.Put_Line('Diretório inválido.');
      UTL_FILE.FCLOSE(MEU_ARQUIVO);
      WHEN Others THEN
      Dbms_Output.Put_Line('Problemas na gravação do arquivo.');
      UTL_FILE.FCLOSE(MEU_ARQUIVO);
      END;
      /
    • By EREGON
      Olá,
       
      estou a ter problemas com o seguinte código, dando o erro:
       
      "ORA-01861: o literal não corresponde à cadeia de caracteres do formato"
       
      MERGE INTO B491_MAIN main USING( SELECT ACESS_ID, CASE WHEN (ACESS_ID IN (SELECT ACESS_ID FROM ( SELECT ACESS_ID, END_DATE_CP, SUBSTR(TO_CHAR(SYSDATE, 'YYYYMMDD'), 1, 6) || BILL_CYCLE_CODE AS REF_DATE, BILL_CYCLE_CODE, TO_CHAR(SYSDATE, 'YYYYMMDD') AS PREBILL FROM B491_MAIN WHERE EXCLUSAO = 'OK' )t WHERE TO_DATE(END_DATE_CP) < TO_DATE(REF_DATE) AND TO_DATE(END_DATE_CP) < TO_DATE(PREBILL) - 15 AND TO_DATE(REF_DATE) < TO_DATE(PREBILL) - 8 ) ) THEN 'POST_BILL' ELSE 'PRE_BILL' END AS DECISION FROM B491_MAIN WHERE EXCLUSAO = 'OK' )tabela ON(tabela.ACESS_ID = main.ACESS_ID) WHEN MATCHED THEN UPDATE SET LIST_ID = tabela.DECISION WHEN NOT MATCHED THEN INSERT (LIST_ID) VALUES('POST_BILL') ; O código dentro do "USING" corre bem.
       
      Alguma ajuda?
       
      Obrigado.
       
       
    • By asacap1000
      Galera estou com uma consulta que ainda não consegui entender o porque. gostaria que ela trouxesse em apenas uma linha mas não vem de forma alguma.
       
      SELECT BO.LAGER, BO.ID_OS, K.ID_KLIENT, K.SUCHBEGRIFF CNPJ_CPF, K.NAME, BI.DIV_1 LOTE, BI.DIV_10 DI_DDE, (SELECT DISTINCT DIS.ID_DISPATCHER FROM FISCAL.DOCHD DC, WMS_EADI.DISPATCHER DIS WHERE DC.DOCHD_DOC_ID = BO.NR_NF AND DC.DOCHD_RPS_DESP = DIS.SUCHBEGRIFF) COD_COMISSARIA, (SELECT DISTINCT DIS.BEZ FROM FISCAL.DOCHD DC, WMS_EADI.DISPATCHER DIS WHERE DC.DOCHD_DOC_ID = BO.NR_NF AND DC.DOCHD_RPS_DESP = DIS.SUCHBEGRIFF) COMISSARIA, BO.NR_NF, BO.DATE_BILL, BO.DATE_EMISS, --------ABAIXO OS TIPOS DE SERVIÇOS ONDE ESTÃO OCORRENDO CADA RESULTADO ELE CRIA UMA LINHA---------------- (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'ARMAZ')) VLR_ARMAZ, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'GER.RISCO')) VLR_GER_RISCO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'MOVIMENT')) VLR_MOVIMENTACAO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'DESUNIT')) VLR_DESUNIT, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'PESAGEM')) VLR_PESAGEM, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT LIKE 'AVERBA%')) VLR_AVERBACAO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND WER.WERT = 'FAT.MINIMO.')) VLR_FAT_MINIMO, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND BLL.BILLITE NOT IN ('21.02', '21.03') AND WER.WERT = 'OUT.SERV.')) VLR_OUTROS_SERV, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND BLL.BILLITE = '21.02' AND WER.WERT = 'OUT.SERV.')) TRANSF_IN, (SELECT SUM(ROUND(OSI.PREIS, 2)) FROM BILL_OS_ITEM OSI WHERE OSI.LAGER = BO.LAGER AND OSI.ID_KLIENT = K.ID_KLIENT AND OSI.ID_OS = BO.ID_OS AND OSI.BILLITE = BI.BILLITE AND OSI.DIV_1 = BI.DIV_1 --AND NVL(OSI.DIV_10, 'x') = NVL(BI.DIV_10, 'x') AND OSI.BILLITE IN (SELECT BLL.BILLITE FROM BILL_ITEM BLL, WERTE WER WHERE BLL.TIPO_FAT = WER.WERT AND WER.WERTE_BER = 'ITENSF' AND BLL.BILLITE = '21.03' AND WER.WERT = 'OUT.SERV.')) TRANSF_OUT FROM BILL_OS BO, BILL_OS_ITEM BI, KLIENTEN K WHERE BO.LAGER = BI.LAGER AND BO.ID_KLIENT = BI.ID_KLIENT AND BO.ID_OS = BI.ID_OS AND BO.LAGER = K.LAGER AND BO.ID_KLIENT = K.ID_KLIENT and k.id_klient = '3099' and BO.NR_NF = '121304' AND BO.STATUS = '90' AND TRUNC(BO.DATE_BILL) BETWEEN '28/08/2019' AND '28/08/2019' GROUP BY BO.LAGER, BO.ID_OS, K.ID_KLIENT, K.SUCHBEGRIFF, K.NAME, BO.DATE_EMISS, BO.NR_NF, BO.DATE_BILL, BI.BILLITE, BI.DIV_1, BI.DIV_10
       
      Alguem consegue identificar neste select porque ele vem assim?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.