Loop fácil em PL/SQL

18/janeiro/2012 - Oracle

Olá!

Dica rápida: Eu não conhecia a sintaxe do for abaixo, resolvi compartilhar. Não precisa declarar cursor nem dar open, fetch e close.

begin

— A variavel armazena cada linha retornada pelo select.
for variavel in ( select a.nome
from tab_cliente a
where a.idade >= 18) loop

— Faz alguma coisa com a variavel.
pro_teste(‘maior_idade’ , variavel.nome);

end loop;

end;

Olá

Hoje me deparei com um erro diferente ao tentar conectar ao banco de dados Oracle numa aplicação Java.

Caused by: java.sql.SQLException: Io exception: NL Exception was generated

Depois de algumas analises verifiquei que a string de conexão estava errada:


jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(protocol=tcp)(host=198.31.10.51)(port=1521))(ADDRESS=(protocol=tcp)(host=198.31.10.50)(port=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=meu_banco))

No final da string faltou um fecha parênteses “)”.

Abaixo string que funciona sem problemas:


jdbc:oracle:thin:@(DESCRIPTION=(LOAD_BALANCE=on)(FAILOVER=on)(ADDRESS_LIST=(ADDRESS=(protocol=tcp)(host=198.31.10.51)(port=1521))(ADDRESS=(protocol=tcp)(host=198.31.10.50)(port=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=meu_banco)))

portanto quando ocorrer esse erro verifique sua string nos mínimos detalhes.

Até mais,

Fatorial com Oracle SQL

05/julho/2011 - Oracle

Olá

Abaixo um SQL diferente que calcula o fatorial de um número

with fatorial as
    (select level idx from dual connect by level <= 15)
    select idx, exp( sum( ln(idx) ) over (order by idx) ) fact
      from fatorial

Resultado:

Resultado da query

Resultado da query

Eu achei interessante, pois alguns comandos ali eu nunca tinha visto apesar de trabalhar a bastante tempo com Oracle DB.

Até mais.

ORA-01722: invalid number

13/março/2011 - Oracle

Olá,

Se você usa o to_number() para converter varchar2 em number provavelmente já teve esse problema ou um dia terá.
O problema aparenta ser simples quando tem uma variável varchar2 com caracteres estranhos no meio, mas e quando você tem certeza que o número esta certo. E quando to_number() funciona corretamente só quando o número é inteiro .
Essa dor de cabeça aparece quando tem o separador de decimal e/ou de milhar, que é diferente conforme a localização usada. Geralmente usamos o ponto, que é o normal para programadores. Mas o oracle pode te pegar de calças curtas.

Vamos usar a simples query abaixo para demonstrar o problema

select to_number('3.1415', '9D9999'), 1/2 from dual;

Rode a query abaixo para saber as configurações da sessão atual.

 select *
   from v$nls_parameters
  where parameter in
		('NLS_LANGUAGE', 'NLS_CHARACTERSET');

Se retornar isso:

   	PARAMETER	        VALUE
1	NLS_LANGUAGE	    BRAZILIAN PORTUGUESE
2	NLS_CHARACTERSET	WE8ISO8859P1

A query de exemplo vai retornar erro: ORA-01722: invalid number

SQL> select  to_number('3.1415', '9D9999'), 1/2 from dual;
select  to_number('3.1415', '9D9999'), 1/2 from dual
                  *
ERROR at line 1:
ORA-01722: invalid number

Se trocarmos o ponto pela vírgula vai funcionar perfeitamente

SQL>  select  to_number('3,1415', '9D9999'), 1/2 from dual;

TO_NUMBER('3,1415','9D9999')        1/2
---------------------------- ----------
                      3,1415         ,5

Para funcionar com ponto, o NLS_LANG deve ser o AMERICAN_AMERICA.WE8ISO8859P1, mostrado abaixo:

   	PARAMETER	        VALUE
1	NLS_LANGUAGE	    AMERICAN
2	NLS_CHARACTERSET	WE8ISO8859P1

Desse forma se usarmos o ponto vai funcionar.

SQL> select  to_number('3.1415', '9D9999'), 1/2 from dual
  2  ;

TO_NUMBER('3.1415','9D9999')        1/2
---------------------------- ----------
                      3.1415         .5

Com esse post demonstrei que o cliente é que manda, não sei tem como o DBA travar isso, mas pelo menos nos bancos que eu acesso tem essa característica.

Para alterar esse comportamento no linux basta usar o export para criar a variável NLS_LANG

export NLS_LANG="BRAZILIAN PORTUGUESE_BRAZIL.WE8ISO8859P1"
export NLS_LANG="AMERICAN_AMERICA.WE8ISO8859P1"

No windows vá nas propriedades do sistema, aba avançado e clique no botão variáveis de ambiente. Utilize o botão novo para criar uma nova variável, coloque no nome NLS_LANG e o valor que desejar.

Até mais,

JasperReports com Oracle ADF

07/dezembro/2010 - Java, Oracle

Olá

Escrevo este post para deixar uma dica para quem precisa integrar ADF com JasperReports. No blog GEBS foi publicado um artigo sobre esse tema com direito a exemplo para download.

Veja o artigo clicando no link a seguir: http://www.gebs.ro/blog/oracle/jasper-reports-in-adf/

Até mais

Roberto