Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

Subtração entre linhas

Olá, gostaria de saber se haveria na linguagem PL/SQL uma forma de subtrair entre linhas.

45 30/06/2020 00:23:58 VERDE

46 30/06/2020 00:32:44 VERDE

47 30/06/2020 00:46:24 VERDE

Essa é parte de uma extensa tabela, gostaria de calcular a diferença de tempo entre os atendimentos. Por exemplo, entre o 45 e o 46 houve um tempo de 00:09 minutos Existe uma forma de calcular isso no Oracle?

11 respostas

Olá Samira, tudo bem?

Sim, uma forma para calcular a diferença de tempo entre atendimentos, poderia ser feita dessa forma:

set serveroutput on;
DECLARE
        CURSOR cur_CLIENTE IS SELECT ID, DATA FROM nome_tabela;
        v_ID nome_tabela.ID%type;
        v_DATA nome_tabela.data%type;
    v_MOMENTO_ANTERIOR date;
    v_CONTADOR int := 0;
    diferenca_em_horas NUMBER;
    diferenca_em_minutos NUMBER;
BEGIN
    OPEN cur_CLIENTE;
    LOOP
        FETCH cur_CLIENTE INTO v_ID, v_DATA;
    EXIT WHEN cur_CLIENTE%NOTFOUND;
        IF v_CONTADOR = 0 
            THEN v_MOMENTO_ANTERIOR := v_DATA;
        END IF;

        diferenca_em_horas := (v_DATA - v_MOMENTO_ANTERIOR) * 24;
        diferenca_em_minutos := diferenca_em_horas * 60;

        dbms_output.put_line( 'Minutos: ' || ROUND(diferenca_em_minutos));
        v_CONTADOR := v_CONTADOR + 1;
        v_MOMENTO_ANTERIOR := v_DATA;
    END LOOP;
    CLOSE cur_CLIENTE;
END;

Em um bloco de PL/SQL, utilizando cursor, loop e um contador, neste caso é retornado apenas a diferença entre minutos.

Espero ter ajudado e bons estudos!

Oi Danielle, tudo bom?

Caramba, não sei nem por onde começar essa parte Entendi no sentido mais generalista, teria como detalhar? Em algum módulo do curso de oracle ensina essa parte? Quando eu faço essa declaração ela afetará de alguma forma a estrutura da tabela?

Agradeço desde já

Olá Samira, durante o curso não tem exatamente a explicação completa dessa parte, mas é mostrado basicamente como funciona, por exemplo o CURSOR, o loop, e não será alterada a estrutura de suas tabelas, pois é apenas uma consulta usando PL\SQL. Vou tentar explicar para você o que é feito nesse bloco de código:

Entre o Declare e o Begin, é onde declaramos as nossas variáveis, neste caso,

  • Declaramos o CURSOR, onde definimos o conjunto de linhas para qual o cursor aponta pelo comando: CURSOR cur_CLIENTE IS SELECT ID, DATA FROM nome_tabela;

  • Declaramos as variáveis da sua tabela que serão utilizadas no procedimento: v_ID nome_tabela.ID%type; v_DATA nome_tabela.data%type;

  • Declaramos também um contador: v_CONTADOR int := 0;`

  • E por ultimo declaramos as variáveis que serão utilizadas para o calculo da diferença de hora e minutos: diferenca_em_horas NUMBER; diferenca_em_minutos NUMBER; v_MOMENTO_ANTERIOR date;

Dentro do Begin iniciamos o CURSOR, OPEN cur_CLIENTE; e iniciamos o Loop e informamos que o cursor irá ser executado até que não seja encontrado linhas na sua tabela para percorrer:

FETCH cur_CLIENTE INTO v_ID, v_DATA;
    EXIT WHEN cur_CLIENTE%NOTFOUND;

Como o é primeira vez que o seu procedimento é executado e o valor do seu contador é 0 ele irá entrar no IF, a variável v_MOMENTO_ANTERIOR vai receber o valor de v_DATA, que é o primeiro valor de data que foi buscado na sua tabela:

IF v_CONTADOR = 0 
            THEN v_MOMENTO_ANTERIOR := v_DATA;
        END IF;

Depois é feito o calculo o para saber a diferença de horas e minutos entre as datas e depois é exibida a diferença em minutos:

diferenca_em_horas := (v_DATA - v_MOMENTO_ANTERIOR) * 24; 
diferenca_em_minutos := diferenca_em_horas * 60; 
dbms_output.put_line( 'Minutos: ' || ROUND(diferenca_em_minutos)); 

O contador é incrementado e o a variável v_MOMENTO_ANTERIOR recebe a data atual da variável v_DATA:

v_CONTADOR := v_CONTADOR + 1;

v_MOMENTO_ANTERIOR := v_DATA;

Esse procedimento é repetido até que o cursor percorra toda a sua tabela, depois que ele não encontrar mais nada, o Loop é encerrado e o CURSOR é fechado:

  END LOOP;
   CLOSE cur_CLIENTE;

Espero ter ajudado!

Olá Danielle

Primeiro gostaria de agradecer, por quanto você tem me ajudado muito

Segundo, em qual parte que é explanado sobre cursores e loops?

E por fim eu gostaria de tirar algumas dúvidas em relação a aplicação dos cursores e loops no código que estou desenvolvendo

  • O set serveroutput on faz com que possa ser executada os comandos que estamos desejando ?
  • Esse é minha query atual:
SELECT
       DOC.CD_REGISTRO_DOCUMENTO "REGISTRO"
      ,DOC.CD_ATENDIMENTO "ATENDIMENTO"
      ,ATENDIME.CD_ORI_ATE
      ,ORI_ATE.DS_ORI_ATE
      ,DOC.NM_USUARIO
      ,DOC.CD_DOCUMENTO "COD. DOCUMENTO"
      ,DOCUMENTO.DS_DOCUMENTO "DOCUMENTO"
      ,to_char(DOC.DT_REGISTRO,'DD/MM/YYYY') "DIA"
      ,SUBSTR(TO_CHAR(DOC.DT_REGISTRO),10,20) AS HORARIO
      ,CORES.STATUS

FROM REGISTRO_DOCUMENTO DOC
INNER JOIN ATENDIME ATENDIME
  ON ATENDIME.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
INNER JOIN DOCUMENTO DOCUMENTO
  ON DOCUMENTO.CD_DOCUMENTO = DOC.CD_DOCUMENTO
INNER JOIN ORI_ATE ORI_ATE
  ON ORI_ATE.CD_ORI_ATE = ATENDIME.CD_ORI_ATE
INNER JOIN VDIC_TRIAGEM_INFANTIL_COR CORES --// ATRELANDO VDIC //--
  ON CORES.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
WHERE TO_CHAR(ATENDIME.DT_ATENDIMENTO,'DD/MM/YYYY' )= '30/06/2020'
AND ATENDIME.CD_ORI_ATE = '11'
AND DOC.SN_IMPRESSO NOT in ('C')
AND doc.cd_documento in ('180','157','115')
ORDER BY ATENDIME.CD_ATENDIMENTO,
         CORES.STATUS,
         HORARIO;

Gostaria de entender se coloco esse código todo no momento em que estou fazendo a declaração do cursor?

  • Nessa tabela não há ID, pode-se utilizar o campo REGISTRO?

Uma vez mais agradeço por estar me ajudando a aprender mais Grande abraço

Olá Samira!

No Curso de Oracle PL/SQL: Procedures, funções e exceções, na aula 05 Estruturas de repetição fala sobre Loop e na aula 06 Acesso aos dados com Cursor fala sobre cursores, mas se você tiver como ver todo o curso, pode ajudar ainda mais.

O set serveroutput on é utilizado para que seja possível exibir no console mensagens de procedimentos armazenados, pacotes e gatilhos através do pacote DBMS_OUTPUT, por exemplo, dbms_output.put_line( 'Minutos: ' || ROUND(diferenca_em_minutos)), para que seja exibido no console a palavra Minutos e o Valor, é necessário que antes seja executado o set serveroutput on, você pode ver mais sobre o pacote DBMS_OUTPUT acessando esse link.

Neste caso no momento de declarar o cursor, você só precisa passar os campos que serão necessários para que você tenha o resultado esperado, no exemplo que usei só foi preciso os campos ID e DATA para fazer o calculo da diferença de tempo, então quais campos você acha que são essenciais da sua tabela e que você precisa para obter o resultado que deseja? Você precisa de todos os campos?

Sim, você pode utilizar o registro no lugar do ID, no meu caso utilizei o ID, pois ele é a chave primaria da minha tabela e o campo que identifica os meus registros.

Danielle, bom dia

Tudo bom???

Ficou excelente a sua explicação, me ajudou bastante a compreender e aproveitei para assistir as aulas desse módulo desde o começo para aprofundar meu entendimento antes de dar andamento.

Acabei adaptando conforme minha necessidade.

Porém deu erro desde a primeira linha, como não estou dominando ainda estou aqui te alugando mais um cadinho :D

Só para info, o select roda lindo porém quando coloquei tudo no cursor que deu o bug. Ah, e estou mandando também o erro que deu. Se puder me dar mais esse norte vai ser de imensa ajuda ^^

Declaração de ERRO:

Erro a partir da linha : 1 no comando -
DECLARE

  CURSOR cur_CLIENTE
  SELECT
       DOC.CD_REGISTRO_DOCUMENTO "REGISTRO"
      ,DOC.CD_ATENDIMENTO "ATENDIMENTO"
      ,ATENDIME.CD_ORI_ATE
      ,ORI_ATE.DS_ORI_ATE
      ,DOC.NM_USUARIO
      ,DOC.CD_DOCUMENTO "COD. DOCUMENTO"
      ,DOCUMENTO.DS_DOCUMENTO "DOCUMENTO"
      ,to_char(DOC.DT_REGISTRO,'DD/MM/YYYY') "DIA"
      ,SUBSTR(TO_CHAR(DOC.DT_REGISTRO),10,20) AS HORARIO 
      ,CORES.STATUS

FROM REGISTRO_DOCUMENTO DOC
INNER JOIN ATENDIME ATENDIME
  ON ATENDIME.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
INNER JOIN DOCUMENTO DOCUMENTO
  ON DOCUMENTO.CD_DOCUMENTO = DOC.CD_DOCUMENTO
INNER JOIN ORI_ATE ORI_ATE
  ON ORI_ATE.CD_ORI_ATE = ATENDIME.CD_ORI_ATE
INNER JOIN VDIC_TRIAGEM_INFANTIL_COR CORES --// ATRELANDO VDIC //--
  ON CORES.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
WHERE TO_CHAR(ATENDIME.DT_ATENDIMENTO,'DD/MM/YYYY' )= '30/06/2020'
AND ATENDIME.CD_ORI_ATE = '11'
AND DOC.SN_IMPRESSO NOT in ('C')
AND doc.cd_documento in ('180','157','115')
ORDER BY ATENDIME.CD_ATENDIMENTO,
         CORES.STATUS,
         HORARIO;
BEGIN

END;
Relatório de erros -
ORA-06550: linha 4, coluna 3:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:

   ( ; é retornar
The symbol "é" was substituted for "SELECT" to continue.
ORA-06550: linha 17, coluna 1:
PLS-00103: Encountered the symbol "INNER" when expecting one of the following:

   , ; for grupo having intersect menos ordem iniciar union onde
   conectar
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:
Erro a partir da linha : 2 no comando -
DECLARE

  CURSOR cur_TEMPO_ATEND IS
  SELECT
       DOC.CD_REGISTRO_DOCUMENTO "REGISTRO"
      ,DOC.CD_ATENDIMENTO "ATENDIMENTO"
      ,ATENDIME.CD_ORI_ATE
      ,ORI_ATE.DS_ORI_ATE
      ,DOC.NM_USUARIO
      ,DOC.CD_DOCUMENTO "COD. DOCUMENTO"
      ,DOCUMENTO.DS_DOCUMENTO "DOCUMENTO"
      ,to_char(DOC.DT_REGISTRO,'DD/MM/YYYY') "DIA"
      ,SUBSTR(TO_CHAR(DOC.DT_REGISTRO),10,20) AS HORARIO 
      ,CORES.STATUS

  FROM REGISTRO_DOCUMENTO DOC
  INNER JOIN ATENDIME ATENDIME
    ON ATENDIME.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  INNER JOIN DOCUMENTO DOCUMENTO
    ON DOCUMENTO.CD_DOCUMENTO = DOC.CD_DOCUMENTO
  INNER JOIN ORI_ATE ORI_ATE
    ON ORI_ATE.CD_ORI_ATE = ATENDIME.CD_ORI_ATE
  INNER JOIN VDIC_TRIAGEM_INFANTIL_COR CORES --// ATRELANDO VDIC //--
    ON CORES.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  WHERE TO_CHAR(ATENDIME.DT_ATENDIMENTO,'DD/MM/YYYY' )= '30/06/2020'
  AND ATENDIME.CD_ORI_ATE = '11'
  AND DOC.SN_IMPRESSO NOT in ('C')
  AND doc.cd_documento in ('180','157','115')
  ORDER BY ATENDIME.CD_ATENDIMENTO,
           CORES.STATUS,
           HORARIO;

    V_REGISTRO REGISTRO_DOCUMENTO.CD_REGISTRO_DOCUMENTO%TYPE;
    V_DATA_REGISTRO REGISTRO_DOCUMENTO.DT_REGISTRO%TYPE;

  V_MOMENTO_ANTERIOR DATE;
  V_CONTADOR INT :=0;
  DIFERENCA_EM_HORAS NUMBER;
  DIFERENCA_EM_MINUTOS NUMBER;

BEGIN
  OPEN cur_TEMPO_ATEND;

  LOOP
    FETCH cur_TEMPO_ATEND INTO V_REGISTRO, V_DATA_REGISTRO;
  EXIT WHEN cur_TEMPO_ATEND%NOTFOUND;
    IF V_CONTADOR = 0
      THEN V_MOMENTO_ANTERIOR := V_DATA;
    END IF;
  DIFERENCA_EM_HORAS := (V_DATA_REGISTRO - V_MOMENTO_ATERIOR)*24;
  DIFERENCA_EM_MINUTOS := DIFERENCA_EM_HORAS * 60;

  DBMS_OUTPUT.PUT_LINE ('MINUTOS: '|| ROUND(DIFERENCA_EM_MINUTOS));
    V_CONTADOR := V_CONTADOR +1;
    V_MOMENTO_ATENRIOR := V_DATA_REGISTRO;
  END LOOP;
  CLOSE cur_TEMPO_ATEND
END;
Relatório de erros -
ORA-06550: linha 58, coluna 1:
PLS-00103: Encountered the symbol "END" when expecting one of the following:

   . ;
The symbol ";" was substituted for "END" to continue.
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

CRIANDO CURSOR

SET SERVEROUTPUT ON;
DECLARE

  CURSOR cur_TEMPO_ATEND IS
  SELECT
       DOC.CD_REGISTRO_DOCUMENTO "REGISTRO"
      ,DOC.CD_ATENDIMENTO "ATENDIMENTO"
      ,ATENDIME.CD_ORI_ATE
      ,ORI_ATE.DS_ORI_ATE
      ,DOC.NM_USUARIO
      ,DOC.CD_DOCUMENTO "COD. DOCUMENTO"
      ,DOCUMENTO.DS_DOCUMENTO "DOCUMENTO"
      ,to_char(DOC.DT_REGISTRO,'DD/MM/YYYY') "DIA"
      ,SUBSTR(TO_CHAR(DOC.DT_REGISTRO),10,20) AS HORARIO 
      ,CORES.STATUS

  FROM REGISTRO_DOCUMENTO DOC
  INNER JOIN ATENDIME ATENDIME
    ON ATENDIME.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  INNER JOIN DOCUMENTO DOCUMENTO
    ON DOCUMENTO.CD_DOCUMENTO = DOC.CD_DOCUMENTO
  INNER JOIN ORI_ATE ORI_ATE
    ON ORI_ATE.CD_ORI_ATE = ATENDIME.CD_ORI_ATE
  INNER JOIN VDIC_TRIAGEM_INFANTIL_COR CORES --// ATRELANDO VDIC //--
    ON CORES.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  WHERE TO_CHAR(ATENDIME.DT_ATENDIMENTO,'DD/MM/YYYY' )= '30/06/2020'
  AND ATENDIME.CD_ORI_ATE = '11'
  AND DOC.SN_IMPRESSO NOT in ('C')
  AND doc.cd_documento in ('180','157','115')
  ORDER BY ATENDIME.CD_ATENDIMENTO,
           CORES.STATUS,
           HORARIO;

    V_REGISTRO REGISTRO_DOCUMENTO.CD_REGISTRO_DOCUMENTO%TYPE;
    V_DATA_REGISTRO REGISTRO_DOCUMENTO.DT_REGISTRO%TYPE;

  V_MOMENTO_ANTERIOR DATE;
  V_CONTADOR INT :=0;
  DIFERENCA_EM_HORAS NUMBER;
  DIFERENCA_EM_MINUTOS NUMBER;

BEGIN
  OPEN cur_TEMPO_ATEND;

  LOOP
    FETCH cur_TEMPO_ATEND INTO V_REGISTRO, V_DATA_REGISTRO;
  EXIT WHEN cur_TEMPO_ATEND%NOTFOUND;
    IF V_CONTADOR = 0
      THEN V_MOMENTO_ANTERIOR := V_DATA_REGISTRO;
    END IF;
  DIFERENCA_EM_HORAS := (V_DATA_REGISTRO - V_MOMENTO_ATERIOR)*24;
  DIFERENCA_EM_MINUTOS := DIFERENCA_EM_HORAS * 60;

  DBMS_OUTPUT.PUT_LINE ('MINUTOS: '|| ROUND(DIFERENCA_EM_MINUTOS));
    V_CONTADOR := V_CONTADOR +1;
    V_MOMENTO_ATENRIOR := V_DATA_REGISTRO;
  END LOOP;
  CLOSE cur_TEMPO_ATEND
END;

Uma vez mais agradeço pela imensa ajuda

Grande abraço

Olá Samira! Que bom que a minha explicação e os cursos ti ajudaram! Os primeiros erros que ocorreram, foi pelo fato de você ter esquecido o IS no momento de declarar o CURSOR, mas isso você corrigiu. Já o segundo o erro, é pelo fato de ter esquecido de colocar o ponto e vírgula(;) no momento de encerrar o cursor:

  CLOSE cur_TEMPO_ATEND;

Então, ele interpreta que o END ainda faz parte desta execução e o erro ocorre, pois, estava sendo esperado o ponto e vírgula(;). Aparentemente era esse o problema no seu código, mas caso tenha novas dúvidas é só falar ;)

Bom dia Danielle

Tenho aprendido muito com as aulas e por aqui com o auxílio de vocês, já indiquei para uma série de amigos ^^

Bom, corrigi o que me passou. Porém, ainda está gerando alguns erros que não compreendi. Apontado para:

  • Linha 2;
  • Linha 45;
  • Linha 50;
  • Linha 55.

Eu precisei inserir aquele select maior porque será necessário exibir todos esses dados em uma única tabela, eu inseri adequadamente essa query no cursor?

Segue o código com o ponto e vírgula e o erro que deu no banco

SET SERVEROUTPUT ON;
DECLARE

  CURSOR cur_TEMPO_ATEND IS
  SELECT
       DOC.CD_REGISTRO_DOCUMENTO "REGISTRO"
      ,DOC.CD_ATENDIMENTO "ATENDIMENTO"
      ,ATENDIME.CD_ORI_ATE
      ,ORI_ATE.DS_ORI_ATE
      ,DOC.NM_USUARIO
      ,DOC.CD_DOCUMENTO "COD. DOCUMENTO"
      ,DOCUMENTO.DS_DOCUMENTO "DOCUMENTO"
      ,to_char(DOC.DT_REGISTRO,'DD/MM/YYYY') "DIA"
      ,SUBSTR(TO_CHAR(DOC.DT_REGISTRO),10,20) AS HORARIO 
      ,CORES.STATUS

  FROM REGISTRO_DOCUMENTO DOC
  INNER JOIN ATENDIME ATENDIME
    ON ATENDIME.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  INNER JOIN DOCUMENTO DOCUMENTO
    ON DOCUMENTO.CD_DOCUMENTO = DOC.CD_DOCUMENTO
  INNER JOIN ORI_ATE ORI_ATE
    ON ORI_ATE.CD_ORI_ATE = ATENDIME.CD_ORI_ATE
  INNER JOIN VDIC_TRIAGEM_INFANTIL_COR CORES --// ATRELANDO VDIC //--
    ON CORES.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  WHERE TO_CHAR(ATENDIME.DT_ATENDIMENTO,'DD/MM/YYYY' )= '30/06/2020'
  AND ATENDIME.CD_ORI_ATE = '11'
  AND DOC.SN_IMPRESSO NOT in ('C')
  AND doc.cd_documento in ('180','157','115')
  ORDER BY ATENDIME.CD_ATENDIMENTO,
           CORES.STATUS,
           HORARIO;

    V_REGISTRO REGISTRO_DOCUMENTO.CD_REGISTRO_DOCUMENTO%TYPE;
    V_DATA_REGISTRO REGISTRO_DOCUMENTO.DT_REGISTRO%TYPE;

  V_MOMENTO_ANTERIOR DATE;
  V_CONTADOR INT :=0;
  DIFERENCA_EM_HORAS NUMBER;
  DIFERENCA_EM_MINUTOS NUMBER;

BEGIN
  OPEN cur_TEMPO_ATEND;

  LOOP
    FETCH cur_TEMPO_ATEND INTO V_REGISTRO, V_DATA_REGISTRO;
  EXIT WHEN cur_TEMPO_ATEND%NOTFOUND;
    IF V_CONTADOR = 0
      THEN V_MOMENTO_ANTERIOR := V_DATA_REGISTRO;
    END IF;
  DIFERENCA_EM_HORAS := (V_DATA_REGISTRO - V_MOMENTO_ATERIOR)*24;
  DIFERENCA_EM_MINUTOS := DIFERENCA_EM_HORAS * 60;

  DBMS_OUTPUT.PUT_LINE ('MINUTOS: '|| ROUND(DIFERENCA_EM_MINUTOS));
    V_CONTADOR := V_CONTADOR +1;
    V_MOMENTO_ATENRIOR := V_DATA_REGISTRO;
  END LOOP;
  CLOSE cur_TEMPO_ATEND;
END;
Erro a partir da linha : 2 no comando -
DECLARE

  CURSOR cur_TEMPO_ATEND IS
  SELECT
       DOC.CD_REGISTRO_DOCUMENTO "REGISTRO"
      ,DOC.CD_ATENDIMENTO "ATENDIMENTO"
      ,ATENDIME.CD_ORI_ATE
      ,ORI_ATE.DS_ORI_ATE
      ,DOC.NM_USUARIO
      ,DOC.CD_DOCUMENTO "COD. DOCUMENTO"
      ,DOCUMENTO.DS_DOCUMENTO "DOCUMENTO"
      ,to_char(DOC.DT_REGISTRO,'DD/MM/YYYY') "DIA"
      ,SUBSTR(TO_CHAR(DOC.DT_REGISTRO),10,20) AS HORARIO 
      ,CORES.STATUS

  FROM REGISTRO_DOCUMENTO DOC
  INNER JOIN ATENDIME ATENDIME
    ON ATENDIME.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  INNER JOIN DOCUMENTO DOCUMENTO
    ON DOCUMENTO.CD_DOCUMENTO = DOC.CD_DOCUMENTO
  INNER JOIN ORI_ATE ORI_ATE
    ON ORI_ATE.CD_ORI_ATE = ATENDIME.CD_ORI_ATE
  INNER JOIN VDIC_TRIAGEM_INFANTIL_COR CORES --// ATRELANDO VDIC //--
    ON CORES.CD_ATENDIMENTO = DOC.CD_ATENDIMENTO
  WHERE TO_CHAR(ATENDIME.DT_ATENDIMENTO,'DD/MM/YYYY' )= '30/06/2020'
  AND ATENDIME.CD_ORI_ATE = '11'
  AND DOC.SN_IMPRESSO NOT in ('C')
  AND doc.cd_documento in ('180','157','115')
  ORDER BY ATENDIME.CD_ATENDIMENTO,
           CORES.STATUS,
           HORARIO;

    V_REGISTRO REGISTRO_DOCUMENTO.CD_REGISTRO_DOCUMENTO%TYPE;
    V_DATA_REGISTRO REGISTRO_DOCUMENTO.DT_REGISTRO%TYPE;

  V_MOMENTO_ANTERIOR DATE;
  V_CONTADOR INT :=0;
  DIFERENCA_EM_HORAS NUMBER;
  DIFERENCA_EM_MINUTOS NUMBER;

BEGIN
  OPEN cur_TEMPO_ATEND;

  LOOP
    FETCH cur_TEMPO_ATEND INTO V_REGISTRO, V_DATA_REGISTRO;
  EXIT WHEN cur_TEMPO_ATEND%NOTFOUND;
    IF V_CONTADOR = 0
      THEN V_MOMENTO_ANTERIOR := V_DATA_REGISTRO;
    END IF;
  DIFERENCA_EM_HORAS := (V_DATA_REGISTRO - V_MOMENTO_ATERIOR)*24;
  DIFERENCA_EM_MINUTOS := DIFERENCA_EM_HORAS * 60;

  DBMS_OUTPUT.PUT_LINE ('MINUTOS: '|| ROUND(DIFERENCA_EM_MINUTOS));
    V_CONTADOR := V_CONTADOR +1;
    V_MOMENTO_ATENRIOR := V_DATA_REGISTRO;
  END LOOP;
  CLOSE cur_TEMPO_ATEND;
END;
Relatório de erros -
ORA-06550: linha 45, coluna 44:
PLS-00386: type mismatch found at 'V_DATA_REGISTRO' between FETCH cursor and INTO variables
ORA-06550: linha 45, coluna 5:
PL/SQL: SQL Statement ignored
ORA-06550: linha 50, coluna 44:
PLS-00201: identifier 'V_MOMENTO_ATERIOR' must be declared
ORA-06550: linha 50, coluna 3:
PL/SQL: Statement ignored
ORA-06550: linha 55, coluna 5:
PLS-00201: identifier 'V_MOMENTO_ATENRIOR' must be declared
ORA-06550: linha 55, coluna 5:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Uma vez mais agradeço pelo imenso auxílio

Grande abraço

solução!

Bom Samira, o primeiro erro

PLS-00386: type mismatch found at 'V_DATA_REGISTRO' between FETCH cursor and INTO variables

A variável 'V_DATA_REGISTRO' está recebendo um tipo de dado incompatível.

Os outros dois erros são apenas de digitação, você declarou ela como V_MOMENTO_ANTERIOR e nessas linhas que estão indicando no erro, ela está digitada errada.

Como o seu código é bem complexo, o ideal seria você ir executando por partes e assim conseguir identificar se há mais problemas no seu código e se ele realmente funciona da forma que está hoje.

Ficamos felizes em contribuir com o seu aprendizado :).

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software