quarta-feira, 21 de janeiro de 2015

ORA-01144: File size (6400000 blocks) exceeds maximum of 4194303 [Oracle];

Já devem ter visto este tipo de erro ao criar uma Tablespace.

SQL Error: 
ORA-01144: File size (6400000 blocks) exceeds maximum of 4194303 blocks
01144. 00000 -  "File size (%s blocks) exceeds maximum of %s blocks"

*Cause:    Specified file size is larger than maximum allowable size value.
*Action:   Specify a smaller size.

Esse tipo de erro ocorre quando tentamos criar uma Tablespace com um tamanho maior que o limite do Bloco (db_block_size).

É possível verificar o Tamanho do Bloco do seu Banco de Dados, pelos comandos:

show parameter DB_BLOCK_SIZE
SELECT  * FROM v$parameter
WHERE   name = lower('DB_BLOCK_SIZE');

No meu caso o Bloco do meu Banco tem o tamanho de 8192 (8kb).

 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------
db_block_size                        integer     8192

Visualizando a tabela abaixo, eu só conseguiria criar uma Tablespace de até 32GB.

db_block_size | Datafile upper limit
------------------------------------
      2kb               8GB
      4kb              16GB
      8kb              32GB
      16kb             64GB
      32kb             128GB

Porém..
Temos 2 soluções para este caso.

A primeira delas seria criar múltiplos datafiles com um tamanho menor.
A outra seria utilizar BIGFILE tablespaces (Funcionalidade que chegou no Oracle 10g).

Create BIGFILE tablespace TSD_DADOS datafile '/o1/dat/dados.dbf' size 80000M;

Abs,
Bruno Duarte.

quarta-feira, 14 de janeiro de 2015

Como limpar a Tablespace Temporária [Oracle];

Já devem ter passado por situações em que fosse necessário limpar a Tablespace TEMP.

Caso você tenha tentado efetuar um DROP para depois recriar a Tablespace TEMP, com certeza o seguinte erro retornou:

SQL> DROP TABLESPACE temp;
drop tablespace temp
*
ERROR at line 1:
ORA-12906: cannot drop default temporary tablespace

Por segurança do próprio Oracle, não conseguimos remover essa Tablespace, ao menos que tenhamos uma outra por default.

Ok...
Para começarmos, o primeiro passo é criar uma outra Tablespace temporária - TEMP2

--Obs: caso não saiba o local do diretório, verificar nas
--views V$TEMPFILE ou DBA_TEMP_FILES.
CREATE TEMPORARY TABLESPACE TEMP2
TEMPFILE 'C:\ORACLE\ORADATA\SW92\TEMP2.DBF' SIZE 500m REUSE
AUTOEXTEND ON NEXT 100M MAXSIZE unlimited
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

--Alteramos para default a nova tablespace recém criada (TEMP2).  
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP2;

--Efetuamos um DROP na antiga Tablespace (No meu caso era a TEMP).
DROP TABLESPACE TEMP including contents and datafiles;

Agora caso queira deixar a Tablespace Temporária com o mesmo nome que antes, será necessário efetuar os passos abaixo.

--Criar uma outra Tablespace Temporária
CREATE TEMPORARY TABLESPACE TEMP
TEMPFILE 'C:\ORACLE\ORADATA\SW92\TEMP.DBF' SIZE 500m REUSE 
AUTOEXTEND ON NEXT 100M MAXSIZE unlimited 
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;

--Alterar para default
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE TEMP;

--Remover a outra Tablespace temporária.
DROP TABLESPACE TEMP2 including contents and datafiles;


Att,
Bruno Duarte.

quinta-feira, 8 de janeiro de 2015

Cálculo do Digito Verificador CPF [Oracle];

Boa tarde!

Em um post do fórum glufke.net estava rolando um assunto sobre como calcular o Digito Verificador do CPF, e um dos usuários desenvolveu a seguinte query que achei muito legal.


select cpf, cast(dig1 || dig2 as varchar2(2)) DigitoVerificador
  from dual
model dimension by (1 as x)
measures (lpad(285757824, 10, '0') as cpf, --O CPF deve ser incluso aqui e sem o digito verificador (Substituir pelo número 285757824)
          0 as m1, 
          0 as dig1, 
          0 as m2, 
          0 as dig2, 
          cast(null as varchar2(11)) as cpfdv)
rules iterate (11)
(  m1[1] = m1[1] + (nvl(substr(cpf[1], iteration_number + 1, 1), 0) * (11 - iteration_number)),
  dig1[1] = case when mod(m1[1], 11) < 2 then 0 else 11 - mod(m1[1], 11) end,
cpfdv[1] = cpf[1] || dig1[1],
    m2[1] = m2[1] + (nvl(substr(cpfdv[1], iteration_number + 1, 1), 0) * (12 - iteration_number)),
  dig2[1] = case when mod(m2[1], 11) < 2 then 0 else 11 - mod(m2[1], 11) end);

O Retorno da consulta é justamente o digito verificador do seu CPF!

Valeu,
Bruno Duarte