Rotina de criptografia e decriptografia

12 Fev 2008

Exemplo de rotina simples para criptografia/descriptografia em PL/SQL.
Observe que a rotina pode ser facilmente convertida para outra linguagem.
Essa rotina pode ser usada, por exemplo, para criptografar um campo que contenha
a senha em um banco.

A mesma rotina que criptografa, serve para descriptografar.

O funcionamento é bem simples: a rotina recebe uma string e retorna outra string,
de mesmo tamanho com cada um dos seus caracteres com valor ASCII invertido,
isto é, se o caractere tiever o valor 0 (zero), o caractere criptografado será 255.
Se o caractere tiver o valor 10, o caractere criptografado será 245.

create or replace function fun_cripto(
  p_valor in varchar2 )
  return varchar2
is
  sCripto varchar2(100) := '';
  cChar   char(1);
  nAsc    number;
begin

  for i in 1..length(p_valor) loop       -- percorre toda a string recebida
    cChar   := substr( p_valor, i, 1 );  -- valor ASCII de cada caractere
    nAsc    := 255 - ascii( cChar );     -- valor ASCII invertido do caractere
    sCripto := sCripto || chr( nAsc );   -- adiciona caractere invertido à string de saída
  end loop;

  return( sCripto );

end fun_cripto;

Conversão decimal para qualquer base

09 Fev 2008

Resumo
Função que converte um número decimal para qualquer outra base.

Uso
A função recebe 3 parâmetros:
p_decimal: número a ser convertido
p_base: base desejada
p_tamanho: tamanho da string de retorno

Exemplo:

select dec_to( 255, 16 ) from dual; — converte 255 para base hexadecimal
select dec_to( 255, 2, 8 ) from dual; — converte 255 para base binária, com 8 caracteres na saída

Codificação

create or replace function dec_to( p_decimal number,
p_base pls_integer,
p_tamanho pls_integer default 2 ) return varchar2 is –
– conversao de bases: decimal para qualquer base

– Claudio A. Coelho - 12.09.2001


sRetorno varchar2(50);
sRESTO varchar2(50);
nQUOC number;
nRESTO pls_integer;
nTam pls_integer;

begin
nQUOC := p_decimal;
sRESTO := ”;

if nQUOC = 0 then
sRetorno := ‘0′;
goto fim;
end if;

while nQUOC > 0 loop
if nQUOC > 1 then
nRESTO := MOD( nQUOC, p_base );
nQUOC := TRUNC( nQUOC/p_base );
else
nRESTO := 1;
nQUOC := 0;
end if;
if nResto < 10 then
sRESTO := sRESTO || to_char(nRESTO);
else
sRESTO := sRESTO || chr(65+nResto-10);
end if;
end loop;

sRetorno := ”;
nTam := LENGTH( sRESTO );
for i in 0..nTam-1 loop
sRetorno := sRetorno || substr( sRESTO, nTam-i, 1 );
end loop;

<<fim>>
return ( LPAD( sRetorno, p_tamanho, ‘0′ ) );

end dec_to;


Limitações do Oracle XE

02 Fev 2008

Pela documentação no site da oracle, essas são as limitações do seu banco Free, entretanto, há também a limitação de 20 sessões (conexões) simultâneas na instância, o que pode ser resolvido seguindo os passos descritos do artigo Número máximo de 20 sessões no Oracle XE postado nesse blog.

Any use of the Oracle Database Express Edition is subject to the following limitations;
1. Express Edition is limited to a single instance on any server;
2. Express Edition may be installed on a multiple CPU server, but may only be executed on one processor in any server;
3. Express Edition may only be used to support up to 4GB of user data (not including Express Edition system data);
4. Express Edition may use up to 1 GB RAM of available memory.


Número máximo de 20 sessões no Oracle XE

02 Fev 2008

No exemplo abaixo, passaremos a limitação de 20 sessões do oracle XE para 100 sessões:

a. Conecte do banco como administrador

connect / as sysdba

b. Altere o número de processos para 100

alter system set processes=100 scope=spfile

c. Remova o limite de 20 sessões

alter system reset sessions scope=spfile sid=’*’

d. Pare o banco

shutdown immediate

e. Inicie o banco

startup

Para verificar se as alterações fizeram efeito:

show parameter sessions

show parameter processes