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, 21 de dezembro de 2010
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.
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
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;
/*Cria o arquivo e habilita o spool*/
spool select_file.txt;
/*Cabeçalho*/
select 'owner;table_name;tablespace_
from dual;
/*Detalhes*/
select owner||';'||table_name||';'||
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;
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;
Assinar:
Postagens (Atom)