Migrar dados do Microsoft Access 2003 para Oracle 10gR2

Neste artigo irei demonstrar como pode ser feito uma migração de dados de um ACCESS para o Oracle.
Primeiramente vou mostrar como está o meu ambiente para demonstrar, no meu Windows XP 5.1 com o Client Oracle 10.2.0.1 32b e baixado o Oracle SQL Developer 3.0 (3.0.04.34) for 32-bit Windows (This zip file includes the JDK1.6.0_11)
Instalado o Microsoft Word 2003 (11.5604.5606), é recomendado você instalar o componente do Microsoft Office para o drive o Access que irá aparecer no SQL Developer.
Feito a instalação do office vou baixar uma Base Access para esta demonstração: Northwind.rar
Continue lendo em oraclehome.com.br …


ORA-01466: unable to read data – table definition has changed

Estou tendo problemas com o export do meu banco, onde a aplicação que esta sendo executada no mesmo momento que o meu export executa comandos de truncate table em tabelas do sistema.

E neste momento no meu log  gera uma porcaria de erro ora, [ORA-01466: unable to read data - table definition has changed]

Eu me pergunto: O que fazer nesta situação?

1. Verificar se há a necessidade do desenvolvedor efetuar esse truncate;

2. Verificar se o truncate esta agendado, caso sim trocar o horario do export;

Pois lendo a literatura sobre o comando truncate diz que é um comando DDL, onde move a marca d'água da tabela para zero. Não gerando redo ou undo, consequentemente não tem como burlar um truncate no momento de um export.

Leia mais sobre o truncate: Psoug


Usando Expressão regular em Check Constraint, > 10g

A um tempo atras tive que criar algumas check's para bloquear palavras de um campo, hoje no lugar das dezenas de checks constraints que criei troquei todas por uma unica.
Vou dar um exemplo simples mostrando como funciona e a expressao regular ajudou nesta questão.

Exemplo: Bloquear o campo titulo da tabela gn_globo para que não receba referencias exatas da concorrencia nesta.
A primeira idéia foi utilizar a função instr e minha check:

  1. ALTER TABLE gn_globo
  2. ADD constraint glb_titulo_ban_sbt_ck CHECK
  3. ( instr(lower(titulo), 'sbt') = 0 );
  4. <a href="http://www.rstoever.com/2008/11/29/usando-expressao-regular-em-check-constraint-10g/#more-209" class="more-link">Continue lendo →</a>

Alteração DDL em objetos relacionados

Bom hoje vou abordar uma situação que ocorre muito e claro não se tem muito impacto pois o que vou mostrar é como a Oracle nos ajuda em muitas situações.
Vou criar uma tabela de exemplo e criar uma procedure que chama essa tabela, até ai tudo bem, mas se eu fizer alguma alteracao na estrutura desta o que vai acontecer. É os objeto que estão relacionados a esta tabela ficarão INVALIDOS, mas não há necessidade de ficar preocupado que sua aplicação irá parar de funcionar.
Pois ao ser executado o objeto, este é tentado ser rencopilado e dps executado.
Para ser mais facil de entender irei fazer um exemplo na pratica para ver como funciona, e claro usando algumas coisas como sequence e um pequeno cursor para facilitar todo o contexto, passo a passo:

Primeiramente vamos criar um tabela para o nosso exemplo funcionar legal:

  1. CREATE TABLE tab01 (<br />
  2. campo01 number(11) PRIMARY KEY,<br />
  3. campo02 varchar2(100)<br />
  4. );

Vamos criar um sequence para facilitar um pouco mais a nossa vida:

  1. CREATE sequence ctab01;

Ok, aqui vamos comecar popular a nossa tabelinha soh para ter alguma informacao e ficar mais legal a brincadeira:

  1. INSERT INTO tab01 VALUES (ctab01.NEXTVAL,'AAAAAA');

DECLARE
NUMERO NUMBER(11);
BEGIN
FOR NUMERO IN 1..5
LOOP
insert into tab01 select ctab01.nextval,'BBBBBB' from tab01;
COMMIT;
END LOOP;
END;

Bom nesse passo com a tabela ja criada e populada vamos criar uma procedure onde vai utilizar um campo por exemplo da tabela, só usar dando um select simples:

  1. CREATE OR REPLACE procedure proc_01<br />
  2. is<br />
  3. begin<br />
  4. declare<br />
  5. v_aux varchar2(100);<br />
  6. begin<br />
  7. SELECT campo02 INTO v_aux FROM tab01 WHERE ROWNUM = 1;<br />
  8. end;<br />
  9. end;<br />
  10.  

Agora vamos prestar a atenção no status desse objetos(a procedure PROC_01), ela está VALID:
  1. SQL> SELECT object_name,STATUS FROM ALL_OBJECTS WHERE OBJECT_NAME ='PROC_01';

OBJECT_NAME STATUS
------------------------------ -------
PROC_01 VALID
Nessa etapa vamos criar um campo novo na estrutura da tabela:

  1. ALTER TABLE TAB01 ADD CAMPO03 NUMBER(3);

Então observando novamente o status do objeto PROC_01, nota-se que agora o status está INVALID:
  1. SQL> SELECT object_name,STATUS FROM ALL_OBJECTS WHERE OBJECT_NAME ='PROC_01';

OBJECT_NAME STATUS
------------------------------ -------
PROC_01 INVALID

Mas o que não contavamos é q se precisarmos de usar a proc_01 ela vai funcionar mesmo assim com o status INVALID, pois o Oracle compila o objeto antes de executar, claro se por algum motivo nao interfiriu diretamente no objeto inicial, como trocando o tipo da coluna entre outros.

  1. SQL> EXEC PROC_01;

Assim podes olhar em seguida o status do objeto:
  1. SQL> SELECT object_name,STATUS FROM ALL_OBJECTS WHERE OBJECT_NAME ='PROC_01';

OBJECT_NAME STATUS
------------------------------ -------
PROC_01 VALID

Desta forma podemos notar que se fizeres alguma alteração de estrutura do tipo inclusao ou sem alterar o que está dentro destes objetos do tipo proc, view, func, ou outros o Oracle vai garantir que sua aplicação nao vai parar.
Mas recomenda-se que no momento q fores fazer alguma alteração de estrutura, recompile seus objetos relacionados, para também nao ter dor de cabeça mais tarde.