ODI Tutorial
March 3
2012 Uso da ferramenta Oracle Data Integrator (ODI) para a construção de processos ETL (Extract, Transform and Load). Nesta série de tutoriais, utilizaremos o ODI para integrar dados de diferentes origens (bancos de dados diferentes e arquivos texto) para uma base de destino Oracle.
Desenvolvimento de Procedures
Desenvolvimento de Procedures
Depois de configurar a Topologia para o nosso projeto, começaremos agora a
desenvolver as integrações e o primeiro passo nessa jornada é montar o ambiente de
origem, as tabelas, as visões, as procedures, enfim todos os objetos necessários para
criar a origem dos dados.
Neste post vou disponibilizar a maneira clássica da criação do ambiente e também
propor a utilização do módulo Designer do ODI contruíndo Procedures para exercer a
mesma função.
Mas sempre lembrando que devemos utilizar os objetos de Procedure com muita
cautela, pois as procedures permitem a execução de ações bem complexas, incluindo
comandos SQL. Além disso, elas permitem a utilização das conexões source e target e
ainda suportam biding, isto significa que é possível mover dados de um lado para o
outro usando apenas as procedures.
Os desenvolvedores que se sentem à vontade com código SQL ficam sériamente
tentados a escrever código para fazer transformações e movimentação de dados ao
invés de desenvolver interfaces.
Existem alguns problemas quanto à isso:
Procedures contém código manual que precisa sofrer manutenção.
Procedures não mantém referências com os outros artefatos ODI como
datastores, modelos, etc, fazendo com que a manutenção seja muito mais
complexa comparado às interfaces.
Procedures nunca devem ser utilizadas para mover ou transformar dados,
essas operações devem ser feitas utilizando as interfaces.
Outra importante informação que devemos ter quando iniciamos um projeto de
desenvolvimento é a organização. Organize o seu projeto no inicio da construção, pois
será muito mais fácil realizar o desenvolvimento e manutenção posterior.
O gerenciamento e a organização são pontos críticos quando estamos falando de
integração de dados, o ODI oferece muitas ferramentas que ajudam a organizar o
desenvolvimento e o ciclo de vida do projeto, tais como: perfis de segurança, pastas,
marcadores, versionamento, importação e exportação, impressão de documentação,
etc.
Utilize todas as ferramentas disponíveis para gerenciar o seu projeto. Defina a
organização do projeto, a padronização de nomes e tudo o que pode evitar o caos
depois que o projeto tiver iniciado. Em outros posts iremos detalhar cada uma dessas
ferramentas e features e lembre-se sempre ORGANIZE O SEU PROJETO NO INÍCIO.
Neste post iremos explorar conforme mencionado o objeto Procedure, também
podemos encontrar na literatura e na versão em português do ODI a nomenclatura
Procedimento.
Procedure ou Procedimento como o nome indica, são objetos em que são escritos
qualquer tipo de procedimento “extra” que se faça necessário no processo de ETL.
Podemos criar procedimentos que contenham vários tipos de códigos, de diferentes
tecnologias suportadas pelo ODI, como por exemplo, escrever um procedimento em
PL/SQL, em Java, em Jython, etc.
Modelagem do Sistema
Antes de planejar a criação das PROCEDURES devemos planejar a criação do nosso
banco de dados, lembrando que devemos sempre ORGANIZAR O PROJETO NO INÍCIO,
para o nosso estudo contruiremos um SISTEMA DE CONTROLE DE VENDAS.
O modelo proposto representa uma estrutura básica de vendas de mercadorias, a
estrutura de tabelas representa um modelo clássico de Data Warehouse na origem,
neste modelo teremos as tabelas CLIENTES, PRODUTOS, GRUPO ITEM, ITENS DE
ESTOQUE, TIPO DE CLIENTES, VENDEDORES E FATURAMENTO. No destino estaremos
trabalhando com o conceito de Data Mart criando uma estrutura de cubos e dimensões
para capturar as informações de faturamento para gerenciamento e análise de
performance de vendas, neste modelo teremos as tabelas de Dimensão para
CLIENTES, PRODUTOS, TEMPO (MESES, ANOS, SEMANAS e ETC.), VENDEDORES e a
tabela FATO onde serão registrados os KPI’s e/ou indicadores para montagem das
análises.
Criando as tabelas – Modelo Clássico
Modelo Data Warehouse ( User/Schema – DW.ORIGEM )
-- Tabela TIPO_CLIENTE
CREATE TABLE "DW_ORIGEM"."TIPO_CLIENTE"
( "CD_TIPO_CLIENTE" NUMBER(*,0) NOT NULL ENABLE,
"DS_TIPO_CLIENTE" VARCHAR2(30),
PRIMARY KEY ("CD_TIPO_CLIENTE") ENABLE ) ;
-- Tabela CLIENTE
CREATE TABLE "DW_ORIGEM"."CLIENTE"
( "CD_CLIENTE" NUMBER(*,0) NOT NULL ENABLE,
"NM_CLIENTE" CHAR(30),
"CD_TIPO_CLIENTE" NUMBER(*,0),
PRIMARY KEY ("CD_CLIENTE") ENABLE,
FOREIGN KEY ("CD_TIPO_CLIENTE") REFERENCES "DW_ORIGEM"."TIPO_CLIENTE"
("CD_TIPO_CLIENTE") ON DELETE SET NULL ENABLE );
-- Tabela VENDEDOR
CREATE TABLE "DW_ORIGEM"."VENDEDOR"
( "CD_VENDEDOR" NUMBER(*,0) NOT NULL ENABLE,
"NM_VENDEDOR" CHAR(30),
"PERC_COM" NUMBER(5,2),
PRIMARY KEY ("CD_VENDEDOR") ENABLE ) ;
-- Tabela FATURAMENTO
CREATE TABLE "DW_ORIGEM"."FATURAMENTO"
( "NUM_NF" NUMBER(*,0) NOT NULL ENABLE,
"CD_VENDEDOR" NUMBER(*,0) NOT NULL ENABLE,
"CD_CLIENTE" NUMBER(*,0) NOT NULL ENABLE,
"DT_VENDA" DATE NOT NULL ENABLE,
"TOT_NF" NUMBER(9,2),
"LOCAL_VENDA" VARCHAR2(30),
PRIMARY KEY ("NUM_NF") ENABLE,
FOREIGN KEY ("CD_CLIENTE") REFERENCES "DW_ORIGEM"."CLIENTE"
("CD_CLIENTE") ENABLE,
FOREIGN KEY ("CD_VENDEDOR") REFERENCES "DW_ORIGEM"."VENDEDOR"
("CD_VENDEDOR") ENABLE ) ;
-- Tabela GRUPO_ITEM
CREATE TABLE "DW_ORIGEM"."GRUPO_ITEM"
( "CD_GRUPO_ITEM" NUMBER(*,0) NOT NULL ENABLE,
"NM_GRUPO_ITEM" CHAR(30),
PRIMARY KEY ("CD_GRUPO_ITEM") ENABLE ) ;
-- Tabela ITEM_ESTOQUE
CREATE TABLE "DW_ORIGEM"."ITEM_ESTOQUE"
( "CD_GRUPO_ITEM" NUMBER(*,0) NOT NULL ENABLE,
"CD_ITEM" NUMBER(*,0) NOT NULL ENABLE,
"NM_ITEM" VARCHAR2(40) NOT NULL,
"UNIDADE" VARCHAR2(5),
"PRECO" NUMBER(9,2),
"QTE_ESTOQUE" NUMBER(*,0),
PRIMARY KEY ("CD_GRUPO_ITEM", "CD_ITEM") ENABLE,
FOREIGN KEY ("CD_GRUPO_ITEM") REFERENCES
"DW_ORIGEM"."GRUPO_ITEM" ("CD_GRUPO_ITEM") ENABLE ) ;
-- Tabela ITEM_NF
CREATE TABLE "DW_ORIGEM"."ITEM_NF"
( "NUM_NF" NUMBER(*,0) NOT NULL ENABLE,
"CD_GRUPO_ITEM" NUMBER(*,0) NOT NULL ENABLE,
"CD_ITEM" NUMBER(*,0) NOT NULL ENABLE,
"QTE_VENDA" NUMBER(*,0),
"VLR_UNITARIO" NUMBER(9,2),
PRIMARY KEY ("NUM_NF", "CD_GRUPO_ITEM", "CD_ITEM") ENABLE,
FOREIGN KEY ("CD_GRUPO_ITEM", "CD_ITEM") REFERENCES
"DW_ORIGEM"."ITEM_ESTOQUE" ("CD_GRUPO_ITEM", "CD_ITEM") ENABLE ) ;
Modelo Data Mart ( User/Schema – DW.DESTINO )
-- Tabela DIM_CLIENTE
CREATE TABLE "DW_DESTINO"."DIM_CLIENTE"
( "CD_CLIENTE" NUMBER(*,0),
"NM_CLIENTE" VARCHAR2(30),
"CD_TIPO_CLIENTE" NUMBER(*,0),
"DS_TIPO_CLIENTE" VARCHAR2(30),
"ID_CLIENTE" NUMBER(*,0) NOT NULL ENABLE,
CONSTRAINT "DIM_CLIENTE_PK" PRIMARY KEY ("ID_CLIENTE") ENABLE ) ;
-- Tabela DIM_PRODUTO
CREATE TABLE "DW_DESTINO"."DIM_PRODUTO"
( "ID_PRODUTO" NUMBER(*,0) NOT NULL ENABLE,
"CD_ITEM" NUMBER(*,0),
"CD_GRUPO_ITEM" NUMBER(*,0),
"UNIDADE" VARCHAR2(5),
"NM_ITEM" VARCHAR2(40),
"NM_GRUPO_ITEM" VARCHAR2(30),
CONSTRAINT "DIM_PRODUTO_PK" PRIMARY KEY ("ID_PRODUTO") ENABLE ) ;
-- Tabela DIM_TEMPO
CREATE TABLE "DW_DESTINO"."DIM_TEMPO"
( "ID_TEMPO" NUMBER NOT NULL ENABLE,
"DATA_DIA" DATE,
"DIA" NUMBER,
"DIA_SEMANA" VARCHAR2(50),
"MES" NUMBER,
"MES_ANO" VARCHAR2(50),
"ANO" NUMBER,
"TURNO" VARCHAR2(50),
CONSTRAINT "DIM_TEMPO_PK" PRIMARY KEY ("ID_TEMPO") ENABLE ) ;
-- Tabela DIM_VENDEDOR
CREATE TABLE "DW_DESTINO"."DIM_VENDEDOR"
( "ID_VENDEDOR" NUMBER NOT NULL ENABLE,
"CD_VENDEDOR" NUMBER,
"NM_VENDEDOR" VARCHAR2(30),
"PERC_COM" NUMBER(5,2),
CONSTRAINT "DIM_VENDEDOR_PK" PRIMARY KEY ("ID_VENDEDOR") ENABLE ) ;
-- Tabela FATO_VENDAS
CREATE TABLE "DW_DESTINO"."FATO_VENDAS"
( "ID_PRODUTO" NUMBER NOT NULL ENABLE,
"ID_CLIENTE" NUMBER NOT NULL ENABLE,
"ID_VENDEDOR" NUMBER NOT NULL ENABLE,
"ID_TEMPO" NUMBER NOT NULL ENABLE,
"QTE_VENDA" NUMBER,
"PRC_VENDA" NUMBER(9,2),
FOREIGN KEY ("ID_PRODUTO") REFERENCES "DW_DESTINO"."DIM_PRODUTO"
("ID_PRODUTO") ENABLE,
FOREIGN KEY ("ID_CLIENTE") REFERENCES "DW_DESTINO"."DIM_CLIENTE"
("ID_CLIENTE") ENABLE,
FOREIGN KEY ("ID_VENDEDOR") REFERENCES "DW_DESTINO"."DIM_VENDEDOR"
("ID_VENDEDOR") ENABLE,
FOREIGN KEY ("ID_TEMPO") REFERENCES "DW_DESTINO"."DIM_TEMPO"
("ID_TEMPO") ENABLE ) ;
Inserindo Dados – Modelo Clássico
Modelo Data Warehouse ( User/Schema – DW.ORIGEM )
-- DADOS PARA TABELA TIPO_CLIENTE
Insert into TIPO_CLIENTE (CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values
(5,'COMERCIO');
Insert into TIPO_CLIENTE (CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values
(6,'ARQUITETURA');
Insert into TIPO_CLIENTE (CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values
(7,'INFORMATICA');
Insert into TIPO_CLIENTE (CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values
(8,'INDUSTRIA');
Insert into TIPO_CLIENTE (CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values
(10,'BANCO');
-- DADOS PARA TABELA CLIENTE
Insert into CLIENTE (CD_CLIENTE,NM_CLIENTE,CD_TIPO_CLIENTE) values
(1,'Sanders Roch',7);
Insert into CLIENTE (CD_CLIENTE,NM_CLIENTE,CD_TIPO_CLIENTE) values (2,'Pernal
Livi',8);
Insert into CLIENTE (CD_CLIENTE,NM_CLIENTE,CD_TIPO_CLIENTE) values
(3,'Marenghi Nor',5);
Insert into CLIENTE (CD_CLIENTE,NM_CLIENTE,CD_TIPO_CLIENTE) values (4,'OBrien
Van DerHor',6);
Insert into CLIENTE (CD_CLIENTE,NM_CLIENTE,CD_TIPO_CLIENTE) values (5,'Hanes
Alvis',10);
Insert into CLIENTE (CD_CLIENTE,NM_CLIENTE,CD_TIPO_CLIENTE) values
(7,'Rothman Chit',7);
Insert into CLIENTE (CD_CLIENTE,NM_CLIENTE,CD_TIPO_CLIENTE) values
(9,'Koonitz Scprect Tu',6);
-- DADOS PARA TABELA VENDEDOR
Insert into VENDEDOR (CD_VENDEDOR,NM_VENDEDOR,PERC_COM) values (1,'Maria
ELISA ANGE',9);
Insert into VENDEDOR (CD_VENDEDOR,NM_VENDEDOR,PERC_COM) values (4,'LUCas
Zardo dos reis',10);
Insert into VENDEDOR (CD_VENDEDOR,NM_VENDEDOR,PERC_COM) values
(5,'CLAUDIOMIRO A NUNES',8);
Insert into VENDEDOR (CD_VENDEDOR,NM_VENDEDOR,PERC_COM) values (15,'SILVIA
Maria',6);
Insert into VENDEDOR (CD_VENDEDOR,NM_VENDEDOR,PERC_COM) values (10,'Mirna S
RIAT',6);
Insert into VENDEDOR (CD_VENDEDOR,NM_VENDEDOR,PERC_COM) values (11,'MarA L
Batista',4);
-- DADOS PARA TABELA FATURAMENTO
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(441,1,5,to_date('29/12/04','DD/MM/RR'),123.44,'Ijuí');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(442,4,2,to_date('30/12/04','DD/MM/RR'),58.14,'Santa Rosa');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(12941,5,3,to_date('31/12/04','DD/MM/RR'),28.49,'Panambi');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(12942,5,3,to_date('01/01/05','DD/MM/RR'),1921.72,'Santa Rosa');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(541,1,4,to_date('02/01/05','DD/MM/RR'),51.44,'Ijuí');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(642,11,5,to_date('03/01/05','DD/MM/RR'),23.14,'Panambi');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(2941,10,7,to_date('04/01/05','DD/MM/RR'),12.66,'Ijuí');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(1292,5,9,to_date('05/01/05','DD/MM/RR'),321.01,'Panambi');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(361,4,1,to_date('06/01/05','DD/MM/RR'),73.44,'Santa Rosa');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(2,11,4,to_date('07/01/05','DD/MM/RR'),3.14,'Ijuí');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(191,15,1,to_date('08/01/05','DD/MM/RR'),62.66,'Santa Rosa');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(122,5,2,to_date('09/01/05','DD/MM/RR'),31.64,'Ijuí');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(51,5,5,to_date('11/01/05','DD/MM/RR'),183.99,'Panambi');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(62,4,4,to_date('05/01/05','DD/MM/RR'),29.44,'Santa Rosa');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(371,11,4,to_date('10/01/05','DD/MM/RR'),82.66,'Santa Rosa');
Insert into FATURAMENTO
(NUM_NF,CD_VENDEDOR,CD_CLIENTE,DT_VENDA,TOT_NF,LOCAL_VENDA) values
(1092,10,5,to_date('09/01/05','DD/MM/RR'),221.93,'Ijuí');
-- DADOS PARA TABELA GRUPO_ITEM
Insert into GRUPO_ITEM (CD_GRUPO_ITEM, NM_GRUPO_ITEM) values (7,
'Eletronicos');
Insert into GRUPO_ITEM (CD_GRUPO_ITEM, NM_GRUPO_ITEM) values (4, 'Livraria');
Insert into GRUPO_ITEM (CD_GRUPO_ITEM, NM_GRUPO_ITEM) values (5,
'Informatica');
Insert into GRUPO_ITEM (CD_GRUPO_ITEM, NM_GRUPO_ITEM) values (1, 'Artigos
Esportivos');
-- DADOS PARA TABELA ITEM_ESTOQUE
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (5, 1, 'Cartucho CANON BC-02', 'UND', 72.5, 20);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (5, 2, 'Cartucho EPSON 20093', 'UND', 65.1, 10);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (5, 3, 'Cartucho HP 51629A', 'UND', 45.28, 17);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (5, 36, 'Papel form. 80 1V br.c/3000 SP', 'CXA', 55.79,
6);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (5, 31, 'Refil impr.EXTR.8508 51649A c1', 'CJT', 19.39,
7);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (5, 47, 'Toner HP C 7115A p/laser 1200', 'UND', 245.61,
3);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (5, 50, 'Mouse CLONE c/saida serial', 'UND', 5.33, 3);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (4, 1, 'Cola TENAZ 500grs', 'TBO', 2.5, 20);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (4, 31, 'Caneta esfer.PARKER', 'PC', 5.8, 3);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (4, 33, 'Agenda', 'PC', 6.54, 8);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (4, 4, 'Album', 'PC', 12.78, 12);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (4, 41, 'Regua Metal', 'UND', 1.78, 81);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (7, 2, 'DVD', 'UND', 1222.5, 2);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (7, 4, 'Televisao 14 Pol.', 'PC', 445.8, 3);
Insert into ITEM_ESTOQUE (CD_GRUPO_ITEM, CD_ITEM, NM_ITEM, UNIDADE, PRECO,
QTE_ESTOQUE) values (7, 8, 'PlayStation', 'PC', 512.78, 8);
-- DADOS PARA TABELA ITEM_NF
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (2, 4, 1, 1, 3.14);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (51, 5, 2, 1, 65.1);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (51, 5, 3, 1, 48.28);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (51, 5, 1, 1, 70.61);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (12941, 5, 31, 1, 28.49);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (12942, 7, 2, 1, 1921.72);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (2941, 4, 33, 1, 12.66);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (1292, 5, 47, 1, 245.61);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (1292, 5, 2, 1, 75.4);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (1092, 5, 47, 1, 221.93);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (642, 4, 1, 8, 2.5);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (642, 5, 50, 1, 3.14);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (541, 5, 36, 1, 51.44);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (442, 5, 31, 2, 19.39);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (442, 4, 4, 1, 19.36);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (441, 5, 1, 1, 123.44);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (371, 5, 36, 1, 82.66);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (361, 4, 31, 10, 5.8);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (361, 4, 41, 1, 15.44);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (191, 5, 36, 1, 62.66);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (122, 4, 1, 10, 2.5);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (122, 5, 50, 1, 6.64);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (62, 4, 1, 1, 2.5);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (62, 4, 31, 1, 5.8);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (62, 4, 41, 1, 1.78);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (62, 5, 50, 1, 5.33);
Insert into ITEM_NF (NUM_NF, CD_GRUPO_ITEM, CD_ITEM, QTE_VENDA, VLR_UNITARIO)
values (62, 4, 33, 1, 14.03);
Depois de demonstrar como criaras tabelas e popular com dados utilizando SQL puro,
é chegada a hora de fazer exatamente a mesma coisa só que através do Oracle Data
Integrator.
Criando um novo Projeto
A partir desse momento vamos ingressar no Oracle Data Integrator e criar os
procedimentos (Procedures) para a montagem do nosso ambiente de trabalho,
lembrando que devemos criar as tabelas dos ambientes de origem e destino, depois
dessa tarefa devemos criar outros procedimentos para popular essas tabelas.
Entre no ODI Designer : Start > Programs > Oracle > Oracle Data Integrator
> Designer, selecione OracleDI Tutorial Series Work Repository no Login Name
e em seguida entre com o usuário e senha, no post anterior criamos o usuário
DW_DBA, a senha é DW_DBA.
Após entrar no módulo Designer, clique no botão Insert Project . Neste ponto irá
ser mostrada a figura abaixo, preencha as informações conforme descrito.
OracleDI_Tutorial_Series no campo Name, veja que o campo Code foi preenchido
automaticamente.
Ao terminar o preenchimento do nome do projeto clique no botão OK.
Após a criação do projeto, devemos ter essa visão, o próximo passo é renomear a
pasta chamada First Folder, nesta pasta se encontram todos os principais objetos em
um projeto de ETL, tais como Package (Pacotes), Interfaces (Interfaces de integração)
e Procedures (Procedimento). Vamos renomear esse diretório para Database
Creation e teremos essa visão.
Perceba, que para alterar o nome da pasta, deve-se clicar na pasta com o botão direito
do mouse e selecionar a opção editar, neste instante a janela ao lado será mostrada,
altere o valor do campo disponível para o conteúdo solicitado e clique em OK.
Após essas primeiras configurações teremos esse resultado.
Procedure ODI – Criar Tabelas
Vamos agora criar as Procedures no ODI para montagem das nossas estruturas de
tabelas e para preencher as tabelas originais.
1. Expanda a pasta Database Creation, e clique com o botão direito sobre
Procedures e selecione Insert Procedure.
2. Nomeie a Procedure como Create-Source-Tables. No parâmetro Target
Technology defina como Oracle, deixe o parâmetro Source Technology
como <Undefined>. Clique na pasta Details em seguida clique no ícone
para adicionar os passos na construção da Procedure.
3. Vamos utilizar o campo Command pra montar o código a ser executado. No
nosso projeto iremos utilizar comandos SQL. Entre os parâmetros de acordo
com a tabela abaixo:
Parâmetro Valor
Name CR-TBL-TIPOCLIENTE
Technology Oracle
Context <Execution Context>
Schema LOGICAL_DW_ORIGEM
Command -- Tabela TIPO_CLIENTE
CREATE TABLE "TIPO_CLIENTE"
( "CD_TIPO_CLIENTE" NUMBER(*,0) NOT NULL ENABLE,
"DS_TIPO_CLIENTE" VARCHAR2(30),
PRIMARY KEY ("CD_TIPO_CLIENTE") ENABLE
)
É muito importante ressaltar que devemos trabalhar na pasta Command on
Target, pois estamos gerando códigos diretamente no local onde iremos criar
as tabelas, e não estamos tratando código fonte, mas é possível, criar
procedures através de arquivos texto utilizando os recursos do Command on
Source. Os requisitos são os mesmos as parametrizações também. Por este
motivo também selecionamos tecnologia apenas para o Target Tecnology.
Nota 1: como boas práticas recomendo deixar o parâmetro Context sempre
como <Execution Context> pois a Procedure pode ser facilmente utilizada em
qualquer um dos ambientes parametrizados para o projeto, seja
Desenvolvimento, Teste, Homologação e/ou Produção.
Nota 2: quando executamos um comando SQL no ODI, devemos tirar o
comando “;” para terminação de sentença e não há necessidade de identificar o
OWNER da tabela, no nosso casso “DW_ORIGEM” ou “LOGICAL_DW_ORIGEM”.
Na figura abaixo podemos ver como ficou o resultado final:
4. Expanda a pasta das Procedures e clique com o botão direito sob a Procedure
Create-Source-Table em seguida clique em Execute.
5. Agora abra o ODI Operator. No ODI Operator, click em All Executions, clique
em Refresh e procure a sua sessão, e verifique se a sua procedure foi
executada com sucesso.
6. Agora abra o Oracle SQL Developer e expanda a conexão DW_ORIGEM.
Selecione a pasta Tables e verifique se a sua tabela foi criada.
7. Depois de validar a criação da Tabela TIPO_CLIENTE, repita os procedimentos
até criar todas as tabelas no ambiente.
Nota 3: ao executar o processo de criação pela primeira vez e a tabela é
criada, sempre que executar esse processo posteriormente irá ocorrer erro,
conforme mostrado na figura abaixo, pois a tabela já existe. Para tanto, sempre
que for recriar as tabelas as mesmas devem primeiro ser deletadas.
Procedure ODI – Carregar Tabelas
Agora vamos criar as Procedures para carregar os dados nas tabelas, preencha os
parâmetros de acordo com a tabela abaixo:
Nota 4: Crie uma nova procedure somente para carregar os dados das tabelas.
Parâmetro Valor
Name CR-DATA-TIPOCLIENTE
Technology Oracle
Context <Execution Context>
Schema LOGICAL_DW_ORIGEM
Command -- DADOS PARA TABELA TIPO_CLIENTE begin
Insert into <%=odiRef.getSchemaName("D")%>."TIPO_CLIENTE"
(CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values (5,'COMERCIO');
Insert into <%=odiRef.getSchemaName("D")%>."TIPO_CLIENTE"
(CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values (6,'ARQUITETURA');
Insert into <%=odiRef.getSchemaName("D")%>."TIPO_CLIENTE"
(CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values (7,'INFORMATICA');
Insert into <%=odiRef.getSchemaName("D")%>."TIPO_CLIENTE"
(CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values (8,'INDUSTRIA');
Insert into <%=odiRef.getSchemaName("D")%>."TIPO_CLIENTE"
(CD_TIPO_CLIENTE,DS_TIPO_CLIENTE) values (10,'BANCO');
end;
Nota 5: Perceba que para o commando utilizado no ODI colocamos duas instruções
PL/SQL begin e end e também estou utilizando uma função de substituição para
montar o owner da tabela odiRef.getSchemaName("D")%>.
Depois de montar a Procedure, execute e valide as informações através do ODI
Operator e Oracle SQL Developer.
Nota 6: repita o procedimento até carregar os dados de todas as tabelas. Lembre-se
que você poderá criar várias Procedures ou apenas uma com vários processos dentro
delas.