Chiappa, sou seu fã.

 

________________________________
 De: J. Laurindo Chiappa <jlchia...@yahoo.com.br>
Para: oracle_br@yahoogrupos.com.br 
Enviadas: Quarta-feira, 24 de Julho de 2013 20:16
Assunto: [oracle_br] Re: Ajuda sql de monitoramento de jobs.
  


 
   
 
Colega, Absolutamente não é difícil : primeiro, talvez vc tenha pensado em 
GROUP BY em algum momento (agrupando por JOB_NAME), e isso TOTALMENTE NÃO se 
encaixa aqui : a questão é o GROUP BY *** faz um "SANDUÍCHE" dos n registros, 
agrupando os n registros do grupo numa linha só... Nessa linha vc pode ter uma 
CONTAGEM indicando quantos registros foram agrupados, pode ter um máximo, um 
mínimo, uma média, etc, MAS o fato é que a informação individual é logicamente 
eliminada, os N registros do grupo "viraram" um só.... 
Isso não sendo possível, uma opção interessante é nós (dentro dos dados 
ordenados por JOB_NAME), usarmos alguma alguma funcionalidade que atribua 
(digamos) 1 para a primeira linha do JOB_NAME sendo lido, 2 para a segunda 
execução, 3 para a terceira, etc, E QUE quando mudar de JOB_NAME resete a 
contagem.... Aí ficaria MUITO FÁCIL, é só perguntar no WHERE para filtrar esse 
"número de linha dependente do JOB_NAME" .... 
Tal funcionalidade existe há MUUUUITO TEMPO (desde as priscas eras do Oracle 
8i), e é dada pelas funções analíticas - que, claro, servem para OUTRAS coisas 
também... Na verdade, sempre que vc quer "processar a linha anteriormente lida" 
- no seu caso para saber se mudou de JOB_NAME -, a primeira coisa que se pensa 
é em alguma função analítica... 
Vamos a um exemplinho (com os MEUS dados, no MEU database, que obviamente não 
vão ser os mesmos que o seus) :

=>primeiro, vamos ver os dados brutos, só ordenados :

SYSTEM@o10gr2:SQL>SELECT
JOB_NAME,
STATUS,
LOG_DATE
FROM  DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS'
order by job_name, log_date;

JOB_NAME                  STATUS     LOG_DATE
------------------------- ---------- --------------------------------
RLM$EVTCLEANUP            SUCCEEDED  23/07/13 20:19:43,712000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  23/07/13 20:41:15,008000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 13:55:58,362000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 14:41:14,720000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 15:41:14,803000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 16:41:14,959000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 17:41:14,106000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 19:20:49,353000 -03:00
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 19:41:14,698000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED  23/07/13 20:19:43,962000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 13:55:58,939000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 14:53:34,171000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 15:51:10,220000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 16:48:46,115000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 17:46:22,135000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 19:20:50,180000 -03:00

16 linhas selecionadas.

==> legal : como eu falei acima, vamos Classificar , dar um número, para cada 
linha com o mesmo JOB_NAME :

SYSTEM@o10gr2:SQL>SELECT
JOB_NAME,
STATUS,
LOG_DATE,
RANK() OVER(PARTITION BY JOB_NAME ORDER BY LOG_DATE) NUM_DA_EXEC
FROM  DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS';

JOB_NAME                  STATUS     LOG_DATE                         
NUM_DA_EXEC
------------------------- ---------- -------------------------------- 
-----------
RLM$EVTCLEANUP            SUCCEEDED  23/07/13 20:19:43,712000 -03:00    1
RLM$EVTCLEANUP            SUCCEEDED  23/07/13 20:41:15,008000 -03:00    2
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 13:55:58,362000 -03:00    3
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 14:41:14,720000 -03:00    4
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 15:41:14,803000 -03:00    5
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 16:41:14,959000 -03:00    6
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 17:41:14,106000 -03:00    7
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 19:20:49,353000 -03:00    8
RLM$EVTCLEANUP            SUCCEEDED  24/07/13 19:41:14,698000 -03:00    9
RLM$SCHDNEGACTION         SUCCEEDED  23/07/13 20:19:43,962000 -03:00    1
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 13:55:58,939000 -03:00    2
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 14:53:34,171000 -03:00    3
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 15:51:10,220000 -03:00    4
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 16:48:46,115000 -03:00    5
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 17:46:22,135000 -03:00    6
RLM$SCHDNEGACTION         SUCCEEDED  24/07/13 19:20:50,180000 -03:00    7

16 linhas selecionadas.

=> Taí, EXATAMENTE o que queríamos : o RANK indica que vc vai ter uma 
classificação dentro de um contador, o PARTITION BY JOB_NAME indica que o 
contador vai ser em cima da coluna JOB_NAME (ier, assim que mudar o JOB_NAME o 
contador é zerado, voltando a 1 no próximo JOB_NAME), e dentro de cada JOB_NAME 
as linhas devem ser ordenadas por LOG_DATE, é o que o ORDER BY faz, e essa 
"coluna" com o ranking, com a classificação da linha dentro de cada JOB_NAME eu 
chamei de NUM_DA_EXEC.... 
Agora é babinha , para ter apenas as 5 primeiras linhas dentro de cada JOB_NAME 
é só pedir NUM_DA_EXEC < 6 , olha aí :

SYSTEM@o10gr2:SQL>select * from
(
SELECT
JOB_NAME,
STATUS,
LOG_DATE,
RANK() OVER(PARTITION BY JOB_NAME ORDER BY LOG_DATE) NUM_DA_EXEC
FROM  DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS'
)
where NUM_DA_EXEC < 6;

JOB_NAME                  STATUS      LOG_DATE                          
NUM_DA_EXEC
------------------------- ----------- --------------------------------- 
-----------
RLM$EVTCLEANUP            SUCCEEDED   23/07/13 20:19:43,712000 -03:00     1
RLM$EVTCLEANUP            SUCCEEDED   23/07/13 20:41:15,008000 -03:00     2
RLM$EVTCLEANUP            SUCCEEDED   24/07/13 13:55:58,362000 -03:00     3
RLM$EVTCLEANUP            SUCCEEDED   24/07/13 14:41:14,720000 -03:00     4
RLM$EVTCLEANUP            SUCCEEDED   24/07/13 15:41:14,803000 -03:00     5
RLM$SCHDNEGACTION         SUCCEEDED   23/07/13 20:19:43,962000 -03:00     1
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 13:55:58,939000 -03:00     2
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 14:53:34,171000 -03:00     3
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 15:51:10,220000 -03:00     4
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 16:48:46,115000 -03:00     5

10 linhas selecionadas.

E veja que eu POSSO SIM pedir num WHERE uma coluna que não é exibida, então se 
quiser eu Poderia Sim ao invés de exibir tudo optar por Não Exibir a coluna de 
classificação , veja :

SYSTEM@o10gr2:SQL>select JOB_NAME, STATUS, LOG_DATE from
(
SELECT
JOB_NAME,
STATUS,
LOG_DATE,
RANK() OVER(PARTITION BY JOB_NAME ORDER BY LOG_DATE) NUM_DA_EXEC
FROM  DBA_SCHEDULER_JOB_RUN_DETAILS WHERE OWNER='EXFSYS'
)
where NUM_DA_EXEC < 6;

JOB_NAME                  STATUS      LOG_DATE
------------------------- ----------- ---------------------------------
RLM$EVTCLEANUP            SUCCEEDED   23/07/13 20:19:43,712000 -03:00
RLM$EVTCLEANUP            SUCCEEDED   23/07/13 20:41:15,008000 -03:00
RLM$EVTCLEANUP            SUCCEEDED   24/07/13 13:55:58,362000 -03:00
RLM$EVTCLEANUP            SUCCEEDED   24/07/13 14:41:14,720000 -03:00
RLM$EVTCLEANUP            SUCCEEDED   24/07/13 15:41:14,803000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED   23/07/13 20:19:43,962000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 13:55:58,939000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 14:53:34,171000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 15:51:10,220000 -03:00
RLM$SCHDNEGACTION         SUCCEEDED   24/07/13 16:48:46,115000 -03:00

10 linhas selecionadas.

valews ?? Espero que esta abordagem passo-a-passo, mostrando as diferentes 
"fases" da escrita de um SQl, tenha te sido útil, e que vc passe a contar com 
uma ferramentinha a mais na sua caixa de ferramentas de programação...

[]s

Chiappa

--- Em mailto:oracle_br%40yahoogrupos.com.br, Rafael Mendonca 
<raffaell.ti77@...> escreveu
>
> SELECT to_char(log_date, 'DD-MON-YY HH24:MI:SS') TIMESTAMP, job_name, status,
>        SUBSTR(additional_info, 1, 300) ADDITIONAL_INFO
>   FROM dba_scheduler_job_run_details 
>  where owner = 'XUXA'
>  ORDER BY log_date desc;
>  
>  
> Pessoal, eu queria que essa consulta me retornasse as últimas 5 execuções por 
> nome do JOB. Com essa consulta ele me mostra tudo.
> Alguém poderia ajudar?
> 
> [As partes desta mensagem que não continham texto foram removidas]
>

   
      

[As partes desta mensagem que não continham texto foram removidas]

Responder a