sábado, 16 de fevereiro de 2013

Tabelas externas contendo tipos de dados LOB


Neste artigo será demonstrado como permitir que  tabelas externas possam ler colunas contendo dados do tipo CLOB e BLOB para as operações de carga.

[Conceito]
Tabelas externas: Dispositivo no banco de dados Oracle que permite acessar fontes externas (arquivos textos) e carregá-las para dentro do banco de dados.

Para a demonstração deve-se criar um diretório, apontando para a “filesystem” no sistema operacional, usar o comando abaixo:

SQL> CREATE OR REPLACE DIRECTORY table_load AS '/tmp/';

Directory created.

Nota: Não se esquecer de conceder os privilégios de “READ” e “WRITE” para o usuário manipular os arquivos no diretório criado, usar:

SQL> GRANT READ, WRITE ON DIRECTORY ON table_load TO [USUARIO];

Abaixo estão os arquivos que serão utilizados, estes, deverão ser colocados no caminho indicado na “filesystem” onde o diretório foi criado.

Os dois primeiros arquivos (*.txt) estão no formato texto simples, foram criados utilizando o editor de texto VI ou mesmo o Notepad. Os dois arquivos seguintes (*.doc) foram criado utilizando o editor de texto, utilizando o Microsoft Word Documents. Os documentos contêm dados do tipo CLOB e BLOB para serem lidos utilizando uma tabela externa “external table”.

A seguir deve-se criar o arquivoteste_lobs.txt que terá o conteúdo indicado abaixo. Informações regulares, datas e referências de arquivos contendo os tipos CLOB e BLOB.

1,um,15-FEB-2013,teste1clob.txt,teste1blob.doc
2,dois,16-FEB-2013,teste2clob.txt,teste2blob.doc

Agora que os todos os arquivos estão no diretório indicado, a tabela externa será criada para realizar a leitura dos dados.

SQL> DROP TABLE teste_external_lob_tab;
DROP TABLE teste_external_lob_tab
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> CREATE TABLE teste_external_lob_tab(
2 number_content NUMBER(10),
3 varchar2_content VARCHAR2(100),
4 date_content DATE,
5 clob_content CLOB,
6 blob_content BLOB
7 )
8 ORGANIZATION EXTERNAL
9 (TYPE ORACLE_LOADER
10 DEFAULT DIRECTORY table_load
11 ACCESS PARAMETERS
12 (RECORDS DELIMITED BY NEWLINE
13 BADFILE table_load:'teste_external_lob_tab_%a_%p.bad'
14 LOGFILE table_load:'teste_external_lob_tab_%a_%p.log'
15 FIELDS TERMINATED BY ','
16 MISSING FIELD VALUES ARE NULL
17 (number_content CHAR(10),
18 varchar2_content CHAR(100),
19 date_content CHAR(11) DATE_FORMAT DATE MASK "DD-MON-YYYY",
20 clob_filename CHAR(100),
21 blob_filename CHAR(100)
   )
22 COLUMN TRANSFORMS (clob_content FROM LOBFILE (clob_filename) FROM (teste_external_lob_tab) CLOB, blob_content FROM LOBFILE (blob_filename) FROM (teste_external_lob_tab) BLOB)
23 )
24 LOCATION ('teste_lobs.txt')
25 )
26 PARALLEL 2
27 REJECT LIMIT UNLIMITED
28 /


Table created.


Algumas notas importantes sobre tabelas externas utilizando colunas CLOB e BLOB’s:

§  Os nomes das colunas dos tipos de dados LOB (blob_filename e clob_filename), não devem coincidir com os nomes das colunas (blob_content e clob_content). Este dispositivo é utilizado para acessar os arquivos de dados que contém os dados reais (, para apenas nomes de arquivos onde os dados podem ser encontrados.

§  A cláusula COLUMN TRANSFORMS, indicará que as colunas contendo os tipos de dados CLOB e BLOB’s serão carregadas apartir dos arquivos indicados. Para este exemplo será utilizado uma coluna do arquivo para identificar o nome do arquivo e uma constante para o nome do diretório. Para carregar dados a partir de vários diretórios usar um campo adicional no arquivo de dados para identificar objeto de diretório.

A consulta abaixo irá mostrar os dados da  tabela externa estão corretamente referenciados tanto os dados regulares quanto os dados do tipo LOB.

COLUMN varchar2_content FORMAT A16
COLUMN date_content     FORMAT A12
COLUMN clob_content     FORMAT A25


SELECT number_content,varchar2_content,
TO_CHAR(date_content, 'DD-MON-YYYY') AS date_content,
clob_content, DBMS_LOB.getlength(blob_content) AS blob_length
FROM teste_external_lob_tab;

NUMBER_CONTENT VARCHAR2_CONTENT DATE_CONTENT CLOB_CONTENT             BLOB_LENGTH
-------------- ---------------- ------------ ------------------------ -----------
1              um               15-FEB-2013  Teste 01 coluna CLOB *** 22016
2              dois             16-FEB-2013  Teste 02 coluna CLOB *** 22016

2 rows selected.



Para mais informações sobre tabelas externas acessar, tabelas externas no Oracle. (2011).



MSc. Rubens Oliveira
DBA Oracle Consultor
olivert.dba@consultant.com