terça-feira, 8 de janeiro de 2013

Oracle - Populando tabelas com CLOB e observando o xDB replication

   Em uma bela manhã de sol um estimado colega de trabalho, e porque não dizer amigo Sebastian Webber(http://swebber.me/blog), me pediu um apoio para agilizar um teste que ele estava fazendo com o produto da EnterpriseDB o xDB replication.

   Mas onde eu entrei nessa história? Resumindo eu precisa observar o método que fora criado no Oracle para alimentar a tabela no PostgreSQL.

   Primeira ação, tarefa simples, criar uma tabela:

Usei o usuário 'HR', e com ele executei o seguinte comando:



CREATE TABLE "HR"."TABELA_TESTE" 
   ( "ID" NUMBER(5,0) NOT NULL ENABLE, 
 "NOME" VARCHAR2(2048 BYTE), 
 "PDF" CLOB, 
 "DATA" DATE DEFAULT sysdate, 
  CONSTRAINT "TABELA_TESTE_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" 
 LOB ("PDF") STORE AS BASICFILE (
  TABLESPACE "USERS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION 
  NOCACHE LOGGING 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)) ;



Agora, como popular uma tabela com CLOB? Precisamos criar uma stored procedure da seguinte forma:

CREATE OR REPLACE PROCEDURE p( p_idinit in int, p_idend in int, p_pdf in varchar2 )
AS
 BEGIN

      FOR v_LoopCounter IN p_idinit..p_idend LOOP
      INSERT INTO hr.tabela_teste
        VALUES (v_LoopCounter, NULL, p_pdf, SYSDATE);
    END LOOP;

END;
/


Agora vamos popular a tabela:

EXEC p(1,15000, rpad('*',32000,'*') );


Ao término a tabela conterá 15000 linhas, todas elas com ID correto, na coluna 'nome' será NULL, na coluna 'pdf' 32000 '*' e na coluna 'data' a data corrente.

Finalizados os testes, o que pude observar quanto ao xDB, é que a replicação utiliza triggers e tabelas auxiliares para realizar a replicação para o PostgreSQL. É possível fazer alterações na tabela durante o processo de replicação, entretanto será necessário ajustar a tabela no PostgreSQL.

Uma limitação que pude observar é que exemplo, a coluna 'ID' foi criada com a precisão 5, se alterarmos a precisão da coluna para precisão 30, por exemplo, ao inserir um volume grande de registros a inserção falhará em função da trigger ativa na mesma para o processo de replicação, resumindo, as tabelas auxiliares do xDB criadas durante o mapeamento entre as bases não é atualizado quando se altera a precisão da tabela de origem. Solução, alterar as tabelas auxiliares do xDB no Oracle para atender a necessidade.

Nenhum comentário:

Postar um comentário