terça-feira, 21 de dezembro de 2010

Para alterar o idioma do ODI versão 10

Editar o arquivo odi_params.bat que está em %ODI_JAVA_HOME%/bin e localizar a linha com ODI_ADDITIONAL_JAVA_OPTIONS. Então fazer o SET do idioma desejado como o exemplo abaixo:

Inglês:
set ODI_ADDITIONAL_JAVA_OPTIONS="-Duser.language=en" "-Duser.country=US"

Português Brasil:
set ODI_ADDITIONAL_JAVA_OPTIONS="-Duser.language=pt" "-Duser.country=BR"

Francês:
set ODI_ADDITIONAL_JAVA_OPTIONS="-Duser.language=fr" "-Duser.country=CA"

terça-feira, 5 de outubro de 2010

ODI - Carregar um arquivo texto sem identificador de linha, identificando a linha do fisica do arquivo.

Problema: tem-se um arquivo texto sem um identificador de linha e precisa carrega-lo identificando o nº da linha que ele está. Isso normalmente ocorre quando precisa-se carregar um arquivo com as linhas na ordem que estão.
Para resolver esse problema é preciso customizar um LKM. Nesse caso customizei o LKM File to Oracle (SQLLDR) que utiliza o SQLLoader do Oracle para carregar o arquivo. Abaixo os passos para customização do LKM:
1) Criei uma opção no KM para criar uma coluna sequencial na Work Table - C$ . Quando a opção está setada como Não, o KM tem o comportamento padrão.

2) Na opção 91 - Create work Table -  inseri o codigo abaixo

3) No passo 101 - Generate CTL file - inseri o cogido abaixo


4) Finalmente na interface mapeiei uma coluna com o campo criado na work table
É só executar que os dados são carregados para a tabela com um sequencial que representa a linha na qual o dado está no arquivo.

quarta-feira, 15 de setembro de 2010

ODI - Error: java.lang.OutOfMemoryError

Esse erro ocorre quando o ODI não consegue alocar mais memória para executar processos como importar modelos ou carregar arquivo texto ou restaurar uma solução. Enfim,  qualquer operação muito grande que ele precise alocar muita memória.
A limitação para o tamanho da memória depende de configurações dentro do ODI, do Java Virtual Machine e da Memória Física disponível no SO. Vou demonstrar como mudar as configurações ODI. Para isso você deve localizar o arquivo odiparams na pasta de instalação do produto bin\odiparams.sh ou odiparams.bat
Nesse arquivo localize o trecho abaixo:

ODI_INIT_HEAP=32m
ODI_MAX_HEAP=256m

Esses parâmetros indicam qual é o tamanho inicial do processo java ODI e qual é o maior. Mude o maior  ODI_MAX_HEAP=256m para o tamanho necessário. Para resolver meu problema deixei o ODI_MAX_HEAP=512m

Carga de arquivo realizada com sucesso. 

Obs.: Para avaliar os demais problemas consulte o link http://java.sun.com/performance/reference/whitepapers/tuning.html#section4.1.2 
Na sessão 4.1.2   Heap Sizing


Abraços

sexta-feira, 10 de setembro de 2010

PL/SQL Developer sem TNSNAMES.ORA



Enfrentei um problema num cliente, no qual nao tinha permissão para instalar um client Oracle e precisava conectar no PL/SQL Developer. Para resolver fiz o esquema de editar o campo database da janela de login. Ao inves de procurar pelo nome do banco no arquivo TNSNAMES.ORA eu inseri o TNS mesmo, sem o nome e sem espaços e logou. Abaixo o exemplo de tns e o print da tela de login.
Exemplo TNS:





Eu tinha isso:
Banco1=
        (DESCRIPTION=
                (ADDRESS_LIST=
                        (ADDRESS =
                                 (PROTOCOL=TCP)
                                 (HOST=1.1.1.1)
                                 (PORT=1521)
                        )
                )
                (CONNECT_DATA=
                  (SID=Banco1)
                )
        )

Coloquei isso:
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=1.1.1.1)(PORT=1521)))(CONNECT_DATA=(SID=Banco1)))
E funcionou!!!!!



Só Alegria!!!!

Criar arquivo a partir de select

Precisei criar um arquivo texto de um select no Oracle. Nesse exemplo gero o cabeçalho e os datalhes do arquivo separados por ';' .Achei interessante postar, segue abaixo:

/*Cria o arquivo e habilita o spool*/
spool select_file.txt;
/*Cabeçalho*/
select 'owner;table_name;tablespace_name;status;'
from dual;
/*Detalhes*/
select owner||';'||table_name||';'||tablespace_name||';'||status||';'
from all_tables
order by 1;
/*Desabilita o spool*/
spool off;

Criando uma base de dados Oracle fake

Precisei criar uma base de dados fake para testar uma integração. Abaixo montei os passos para a criação dessa base:
1º) Criando as tabelas da base de dados:

create table odi_run.departamentos
(
cd_depto    integer,
nm_depto    varchar2(300)
)

create table odi_run.funcionarios
(
cd_func     integer,
nm_func     varchar2(300),
dt_nasc     date,
cd_depto    integer
)

2º) Criando as chaves das tabelas:
alter table "DEPARTAMENTOS" add constraint pk_depto primary key("CD_DEPTO")
alter table "FUNCIONARIOS" add constraint pk_func primary key("CD_FUNC")
alter table "FUNCIONARIOS" add constraint FK_DEPTO foreign key("CD_DEPTO") references "DEPARTAMENTOS" ("CD_DEPTO")

3º)Criando os blocos PL/SQL para popular as tabelas criadas:
/*POPULA DEPARTAMENTOS*/
declare
v_codigo number;
v_loop number;
v_cont number;
begin
  v_codigo := 1;
  v_loop := 0;
  v_cont := 0;
  LOOP
           insert into odi_run.departamentos
           (
            cd_depto,
            nm_depto
            )
            values
            (
              v_codigo,
              'Departamento'||(v_loop+v_codigo)  
            );
            if (v_cont = 1000) then
              commit;
              v_cont := 0;
            else
              v_cont:=v_cont+1;
            end if;
           v_loop := v_loop + 1;
           v_codigo := v_codigo +1;
           EXIT WHEN v_loop > 3000; --nº de linhas na tabela
 END LOOP;
end;
/*POPULA FUNCIONARIOS*/
declare
v_codigo number;
v_loop number;
v_cont number;
v_depto number;
v_aux number;
begin
  v_codigo := 1;
  v_loop := 0;
  v_cont := 0;
  v_depto := 1;
  v_aux := 0;
  LOOP
           insert into odi_run.funcionarios
           (
            cd_func,
            nm_func,
            dt_nasc,
            cd_depto
            )
            values
            (
              v_codigo,
              'Fulano de Tal '||(v_loop+v_codigo),  
              SYSDATE-(10000-(v_loop+v_codigo)),
              v_depto
            );
            if (v_cont = 1000) then
              commit;
              v_cont := 0;
            else
              v_cont:=v_cont+1;
            end if;
           v_loop := v_loop + 1;
           v_codigo := v_codigo +1;
           select max(cd_depto) into v_aux from odi_run.departamentos;
           if v_depto >= v_aux then
              v_depto := 1;
           else
              v_depto := v_depto +1;
           end if;
           EXIT WHEN v_loop > 500000; --nº de linhas
 END LOOP;
end;