Re: [oracle_br] Re: [EeTe] O racle: PL/S QL: Execução de S cripts S em interrupções de vido à erros - É possível?!

2018-04-03 Por tôpico eugênio tenório eu_teno...@yahoo.com.br [oracle_br]
 Chiappa, bom dia!
OK. Compreendido. Vou verificar os detalhes, daqui, agora.
E - mais uma vez - muito obrigado por todas as dicas/informações fornecidas.
Um abraço
Eugênio Tenórioeu_tenór...@yahoo.com.br

Em terça-feira, 3 de abril de 2018 10:00:16 BRT, jlchia...@yahoo.com.br 
[oracle_br]  escreveu:  
 
     
Tudo blz ? Então, antes de responder a sua pergunta , deixa eu confirmar : vc 
ENTENDEU que o seu erro é de SINTAXE, vc está usando um comando DE MANEIRA 
ERRADA, né ? E isso não tem como prevenir, o procedimento é SIMPLESMENTE 
escrever o comando corretamente, sim sim ?? 
  Muito bem : isso posto e entendido, os erros de runtime (ie, um comando 
escrito de maneira CORRETA e VÁLIDA que encontra uma situação excepcional - 
tipo, não encontrou dados, ou recebeu mais dados que o previsto, um dado 
inválido apenas em poucas linhas, etc) são capturados no PL/SQL *** não *** com 
um IF mas sim com uma cláusula EXCEPTION : pense na EXCEPTION como um condição 
de ON ERROR GOTO no BASIC, tipo um ponto da sua rotina para onde o fluxo de 
execução vai ser DESVIADO automaticamente quando der erro...  A sintaxe dele é 
: imediatamente antes de um END que termina um bloco BEGIN/END vc declara a 
área de EXCEPTION e indica quais linhas vão ser acionadas em quais situações de 
erro...
  
  ==> o CRITICAMENTE IMPORTANTE pra ser dito aqui (vide manual oficial Oracle 
em https://docs.oracle.com/cloud/latest/db112/CNCPT/transact.htm#CNCPT016) é 
que um comando SQL é ATÔMICO, ie, ele TEM SUCESSO OU FALHA na íntegra, pra 
TODAS as linhas de TODAS as tabelas envolvidas Assim, se vc tem um SELECT 
que vc pediu pro SQL executar na íntegra (é o que acontece tanto pra cursor 
implícito quanto pra SQL inserido fora de LOOPs), não há como vc controlar o 
erro a nível de LINHA, uma falha é uma falha SE vc quer ter controle 
absoluto a esse nível, a nível de CADA LINHA RECUPERADA, em princípio vc TEM 
que usar cursor EXPLÍCITO, onde é VOCÊ que manda o PL/SQL ler cada linha do 
SELECT contido no cursor , assim vc Pode capturar / tratar cada erro em cada 
linha... 
   Para exemplo, digamos que vou pesquisar uma tabela por uma coluna que não é 
chave única, e assim estou prevendo que possa ter mais de uma linha retornada a 
cada pedido de leitura, o que viola o fato de que uma variável local (sem ser 
array) só pode ter UM valor assignado a cada vez - nesse caso uma Opção poderia 
ser tratar a exceção... Não é a única NEM a melhor mas serve como exemplo 
didático... 
   Seria algo mais ou menos tipo :
  
CREATE OR REPLACE PROCEDURE PROC_NOME_COMPLETO (P_DEPARTMENT_ID number) IS
    l_employee_full_name VARCHAR2(500);
    cursor c is
    SELECT last_name || ', ' || first_name
  FROM employees
 WHERE DEPARTMENT_ID = P_DEPARTMENT_ID;
BEGIN
   open c;
      loop
     Begin
        fetch c into l_employee_full_name;
        Exit When c%NotFound;
    Dbms_Output.Put_Line('Empregado Depto=' || P_DEPARTMENT_ID || 
',full name=' || l_employee_full_name);
     Exception
            when TOO_MANY_ROWS then
               dbms_output.put_line('Depto=' || P_DEPARTMENT_ID || ' possui 
mais de um empregado!!');
 End;
  end loop;
   close c;
END;

 ==> Claro, o construto acima é PSEUDOCÓDIGO, não o executei mas acho que deu 
pra pegar a idéia : Ou seja, vc aplica a condição de erro num EXCEPTION, não 
existe IF envolvido... Okdoc ?? mais refs, goto manual PL/SQL da sua versão
 
 []s
 
   Chiappa
  #yiv5688126680 #yiv5688126680 -- #yiv5688126680ygrp-mkp {border:1px solid 
#d8d8d8;font-family:Arial;margin:10px 0;padding:0 10px;}#yiv5688126680 
#yiv5688126680ygrp-mkp hr {border:1px solid #d8d8d8;}#yiv5688126680 
#yiv5688126680ygrp-mkp #yiv5688126680hd 
{color:#628c2a;font-size:85%;font-weight:700;line-height:122%;margin:10px 
0;}#yiv5688126680 #yiv5688126680ygrp-mkp #yiv5688126680ads 
{margin-bottom:10px;}#yiv5688126680 #yiv5688126680ygrp-mkp .yiv5688126680ad 
{padding:0 0;}#yiv5688126680 #yiv5688126680ygrp-mkp .yiv5688126680ad p 
{margin:0;}#yiv5688126680 #yiv5688126680ygrp-mkp .yiv5688126680ad a 
{color:#ff;text-decoration:none;}#yiv5688126680 #yiv5688126680ygrp-sponsor 
#yiv5688126680ygrp-lc {font-family:Arial;}#yiv5688126680 
#yiv5688126680ygrp-sponsor #yiv5688126680ygrp-lc #yiv5688126680hd {margin:10px 
0px;font-weight:700;font-size:78%;line-height:122%;}#yiv5688126680 
#yiv5688126680ygrp-sponsor #yiv5688126680ygrp-lc .yiv5688126680ad 
{margin-bottom:10px;padding:0 0;}#yiv5688126680 #yiv5688126680actions 
{font-family:Verdana;font-size:11px;padding:10px 0;}#yiv5688126680 
#yiv5688126680activity 
{background-color:#e0ecee;float:left;font-family:Verdana;font-size:10px;padding:10px;}#yiv5688126680
 #yiv5688126680activity span {font-weight:700;}#yiv5688126680 
#yiv5688126680activity span:first-child 
{text-transform:uppercase;}#yiv5688126680 #yiv5688126680activity span a 
{color:#5085b6;text-decoration:none;}#yiv5688126680 

[oracle_br] Re: Comparar quantidade de sessões ativas

2018-04-03 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Bom, *** além *** de tudo o que vc falou (E que implica em questões de 
Pagamento de Licenças e etc - NÃO ADINATA CHORAR depois dizendo que ah, o 
Licenciamento é complexo, eu não sabia que um simples SELECT no ASH pode ser 
cobrado :), etc) , eu Acrescento que (ao que Imagino) vc SABE que num RDBMS 
multi-usuário como é o Oracle é IMPOSSÍVEL a CPU atender todas as dezenas (ou 
centenas, ou mais) sessões de uma vez - assim sendo, há um RODÍZIO, algumas 
poucas sessões vão pra status Ativo e são atendidas, aí elas passam a ser 
marcadas como INATIVAS e a CPU vai atender algumas outras (que estavam marcadas 
como INATIVAS e agora passam a ser marcadas como ATIVAS), e assim vai indo 
Da mesma forma, uma sessão que conectou mas há mito tempo não pede nada pro 
banco muito certamente tá inativa há bastante tempo e a tendência é assim 
continuar... ===> OU SEJA, se vc ver uma grande qtdade de sessões INATIVAS num 
dado momento tanto PODE SER que a CPU não tá dando conta de atender a tantas 
sessões simultâneas e assim grande parte delas tá indo pro time slice/rodízio 
QUANTO pode ser que vc tem algum POOL DE CONEXÃO aí e realmente o número de 
sessões tá mesmo MUUUITO maior que o necessário.

Obs feitas, seguinte : a V$ACTIVE_SESSION_HISTORY (e seus snapshots arquivados 
que ficam na DBA_HIST equivalente) só registra sessões ATIVAS, ponto : a nível 
de sistema, pra vc ter uma contagem de sessões geral, vc consulta a 
dba_hist_sysmetric_summary cfrme mostrado em  
http://bbdd-error.blogspot.com.br/2017/10/oracle-historical-session-information.html
 : aí número de sessões inativas seria a contagem geral de sessões menos a 
contagem na DBA_HIST para o snapshot em questão... Não tenho neste momento 
acesso a um banco Oracle pra escrever uma query-exemplo MAS COM CERTEZA não 
deve ser complicado, não

[]s

  Chiappa

Re: [oracle_br] Re: [EeTe] O racle: PL/S QL: Execução de S cripts S em interrupções de vido à erros - É possível?!

2018-04-03 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Tudo blz ? Então, antes de responder a sua pergunta , deixa eu confirmar : vc 
ENTENDEU que o seu erro é de SINTAXE, vc está usando um comando DE MANEIRA 
ERRADA, né ? E isso não tem como prevenir, o procedimento é SIMPLESMENTE 
escrever o comando corretamente, sim sim ?? 
  Muito bem : isso posto e entendido, os erros de runtime (ie, um comando 
escrito de maneira CORRETA e VÁLIDA que encontra uma situação excepcional - 
tipo, não encontrou dados, ou recebeu mais dados que o previsto, um dado 
inválido apenas em poucas linhas, etc) são capturados no PL/SQL *** não *** com 
um IF mas sim com uma cláusula EXCEPTION : pense na EXCEPTION como um condição 
de ON ERROR GOTO no BASIC, tipo um ponto da sua rotina para onde o fluxo de 
execução vai ser DESVIADO automaticamente quando der erro...  A sintaxe dele é 
: imediatamente antes de um END que termina um bloco BEGIN/END vc declara a 
área de EXCEPTION e indica quais linhas vão ser acionadas em quais situações de 
erro...
  
  ==> o CRITICAMENTE IMPORTANTE pra ser dito aqui (vide manual oficial Oracle 
em https://docs.oracle.com/cloud/latest/db112/CNCPT/transact.htm#CNCPT016) é 
que um comando SQL é ATÔMICO, ie, ele TEM SUCESSO OU FALHA na íntegra, pra 
TODAS as linhas de TODAS as tabelas envolvidas Assim, se vc tem um SELECT 
que vc pediu pro SQL executar na íntegra (é o que acontece tanto pra cursor 
implícito quanto pra SQL inserido fora de LOOPs), não há como vc controlar o 
erro a nível de LINHA, uma falha é uma falha SE vc quer ter controle 
absoluto a esse nível, a nível de CADA LINHA RECUPERADA, em princípio vc TEM 
que usar cursor EXPLÍCITO, onde é VOCÊ que manda o PL/SQL ler cada linha do 
SELECT contido no cursor , assim vc Pode capturar / tratar cada erro em cada 
linha... 
   Para exemplo, digamos que vou pesquisar uma tabela por uma coluna que não é 
chave única, e assim estou prevendo que possa ter mais de uma linha retornada a 
cada pedido de leitura, o que viola o fato de que uma variável local (sem ser 
array) só pode ter UM valor assignado a cada vez - nesse caso uma Opção poderia 
ser tratar a exceção... Não é a única NEM a melhor mas serve como exemplo 
didático... 
   Seria algo mais ou menos tipo :
  
CREATE OR REPLACE PROCEDURE PROC_NOME_COMPLETO (P_DEPARTMENT_ID number) IS
l_employee_full_name VARCHAR2(500);
cursor c is
SELECT last_name || ', ' || first_name
  FROM employees
 WHERE DEPARTMENT_ID = P_DEPARTMENT_ID;
BEGIN
   open c;
  loop
 Begin
fetch c into l_employee_full_name;
Exit When c%NotFound;
Dbms_Output.Put_Line('Empregado Depto=' || P_DEPARTMENT_ID || 
',full name=' || l_employee_full_name);
 Exception
when TOO_MANY_ROWS then
   dbms_output.put_line('Depto=' || P_DEPARTMENT_ID || ' possui 
mais de um empregado!!');
 End;
  end loop;
   close c;
END;

 ==> Claro, o construto acima é PSEUDOCÓDIGO, não o executei mas acho que deu 
pra pegar a idéia : Ou seja, vc aplica a condição de erro num EXCEPTION, não 
existe IF envolvido... Okdoc ?? mais refs, goto manual PL/SQL da sua versão
 
 []s
 
   Chiappa

[oracle_br] Comparar quantidade de sessões ativas

2018-04-03 Por tôpico Rafael Mendonca raffaell.t...@yahoo.com [oracle_br]
SEnhores, bom dia.
Indo direto ao ponto, gostaria de saber se vocês possuem uma query ou me 
ajudassem a construir uma query que fizesse a comparação da qtd de sessões 
ativas e TOTAL(sessoes ativas e inativas) de um período com um outro período.
Sei que isso deve ser feito utilizando a v$active_session_history (se os dados 
estao ainda em memoria) ou na dba_hist_active_sess_history. 

Exemplo:
A quantidade usuários ativos ontem as 15 horas e a quantidade de usuários 
ativos hoje as 15 horas.E se possível a quantidade de usuários conectados 
(sessoes ativas e nao ativas).
Eu sei que no AWR report você consegue visualizar, mas eu gostaria da consulta.
SEi tb que para acessar as views eh necessario a option DP.
Obrigado.