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