Arquivo da categoria: oracle 10g

Erro na Instalação – 10.2.0.1 – OUI-10094

Olá PessoALL,

Ontem tive uma necessidade de instalação do Oracle 10gR2 em um cliente. Isso mesmo, estamos em 07/2013, e precisamos instalar um Oracle 10gR2! rsrs. Deixa eu contar um pouco da história:

O banco de produção é um 9.2.0.6 (acharam que não podia ser pior que o 10gR2 né), rodando em um HP-UX Itanium 64bits e que não tem mais suporte por parte da HP, ou seja, temos que nos virar com o que temos para migrar este banco de 9.2.0.6 urgente! Afinal, não temos mais suporte nem do banco nem da máquina onde ele está instalado. Depois de muitas e muitas tentativas de migração, inclusive usando Golden Gate em que não tivemos sucesso, a opção menos pior encontrada foi expdp e impdp, só que para isso precisávamos estar pelo menos no 10g! Sei que deve estar se perguntando… porque não 11g direto? Lembram que a máquina não tem mais suporte? Pois é, para instalar o 11g neste servidor, mesmo sendo certificado, precisava instalar alguns pacotes, e claro que sem suporte, sem contrato e sem nada, a HP não iria dar de mão beijada estes pacotes para nos ajudar a deixar de usar a plataforma deles! Por isso a escolha do passo a passo foi:

1 – Instalar o Oracle 10GR2, 10.2.0.1.

2 – Aplicar o Patchset 10.2.0.4 e eliminar alguns possíveis bugs.

3 – Migrar o banco 9.2.0.6 para 10.2.0.4.

4 – Fazer expdp paralelizado para extrair os dados.

5 – Fazer impdp no novo, querido e parrudo servidor Linux com Oracle 11gR2!

Então, já no passo 1 encontramos um problema, o erro: OUI-10094.

A instalação ocorria normalmente, todas as configurações eram feitas e dava erro apenas na hora de registrar no inventário.

Pois é, na parte mais simples ocorria o erro.

Pesquisando no Metalink, encontrei uma nota que falava a respeito, em que a Oracle assumia sem nenhum pudor que o instalador do 10.2.0.1, versão base do 10gR2 tinha um “bug” que não conseguia fazer atualização de inventário caso tivessem outros Oracle Home´s  instalados com outros owners na mesma máquina. Por exemplo:

Tenho um Oracle 9.2.0.6 instalado com o owner ora96.

Tenho um Oracle 10gR1 instalado com o owner ora101.

No momento de instalar o Oracle 10gR2 com o owner ora102, ele vai ter que adicionar no inventário esta nova instalação, mas… quem criou o inventário não foi o owner ora102, por isso ocorre o problema, mas é um problema no instalador.

O grande aprendizado que quero passar neste post é sobre a recomendação da Oracle para corrigir o problema, que basicamente foi: “Instale o Oracle 10.2.0.1 com o instalador do 10.2.0.4!”, então, na hora de chamar o runInstaller, usar o executável da versão 10.2.0.4 chamando a instalação do 10.2.0.1. Como fazer isso… assim:


[ora10g@srvhp:/home/ora10g]: cd /ora10g/install/patch_10204/disk1/
[ora10g@srvhp:/home/ora10g]: ./runInstaller FROM_LOCATION="/ora10g/install/10201/disk1/stage/products.xml"

Então, o que fizemos foi ir até a pasta de instalação do Patchset 10.2.0.4 e chamar o instalador dele, só que informando que a instalação deveria pegar os produtos da versão base 10.2.0.1, usando o parâmetro FROM_LOCATION. Interessante não?! Você pode instalar um outro “produto” usando o instalador menos “bugado”.

A conclusão disso pra mim é: Que bom que a Oracle é muito boa de documentação, porque esses probleminhas tem de monte! Só que tudo tá documentado e geralmente tem uma solução de contorno!

Temos então nosso 10gR2 instalado e agora vamos a migração! Caso tenhamos mais novidades, mantenho vocês informados!

 

Abraços a todos.

 

 

Atc.

Gerson Júnior

gerson.vasconcelos@gmail.com

Guida de referência de SQL Básico

Fala pessoAll,

Com a contribuição do nosso amigo e leitor Robson Cristovão, está aí um guia básico de SQL que pode ser bastante útil para quem está começando no mundo SQL e tem algumas dúvidas quanto ao uso e sitaxe de alguns comandos SQL! Fica a dica!

AND | OR:
SELECT nome_coluna(s)
FROM nome_tabela
WHERE condiçao
AND | OR condiçao

ALTER TABLE (add coluna):
ALTER TABLE nome_tabela
ADD nome_coluna datatype

ALTER TABLE (drop column):
ALTER TABLE nome_tabela
DROP COLUMN nome_coluna

AS (alias for column):
SELECT nome_coluna AS coluna_apelido
FROM nome_tabela

AS (alias for table):
SELECT nome_coluna
FROM nome_tabela AS tabela_apelido

BETWEEN:
SELECT nome_coluna(s)
FROM nome_tabela
WHERE nome_coluna
BETWEEN valor1 AND valor2

CREATE (database):
CREATE DATABASE nome_base_de_dados

CREATE (index):
CREATE INDEX nome_indice
ON nome_tabela (nome_coluna)

CREATE (table):
CREATE TABLE nome_tabela(
nome_coluna1 tipo_dado,
nome_coluna2 tipo_dado,...)

CREATE (unique index):
CREATE UNIQUE INDEX nome_indice
ON nome_tabela (nome_coluna)

CREATE (view):
CREATE VIEW nome_da_view AS
SELECT nome_coluna(s)
FROM nome_tabela
WHERE condiçao

DELETE:
DELETE FROM nome_tabela
OU
DELETE FROM nome_tabela
WHERE condiçao

DROP (database):
DROP DATABASE nome_base_de_dados

DROP (index):
DROP INDEX nome_tabela.nome_indice

DROP (table):
DROP TABLE nome_tabela

GROUP BY:
SELECT nome_coluna1,SUM(nome_coluna2)
FROM nome_tabela
GROUP BY nome_coluna1

HAVING:
SELECT nome_coluna1,SUM(nome_coluna2)
FROM nome_tabela
GROUP BY nome_coluna1
HAVING SUM(nome_coluna2) valor_da_condiçao

IN:
SELECT nome_coluna(s)
FROM nome_tabela
WHERE nome_coluna
IN (valor1,valor2,..)

INSERT:
INSERT INTO nome_tabela
VALUES (valor1, valor2,....)
OU
INSERT INTO nome_tabela
(nome_coluna1, nome_coluna2,...)
VALUES (valor1, valor2,....)

LIKE:
SELECT nome_coluna(s)
FROM nome_tabela
WHERE nome_coluna
LIKE padrao

ORDER BY:
SELECT nome_coluna(s)
FROM nome_tabela
ORDER BY nome_coluna [ASC | DESC

SELECT:
SELECT nome_coluna(s)
FROM nome_tabela

SELECT (all):
SELECT * FROM nome_tabela

SELECT (distinct):
SELECT DISTINCT nome_coluna(s)
FROM nome_tabela

SELECT (into - usado para criar cópias auxiliares das tabelas):
SELECT * INTO new_nome_tabela
FROM original_nome_tabela
OU
SELECT nome_coluna(s)
INTO new_nome_tabela
FROM original_nome_tabela

TRUNCATE:
TRUNCATE TABLE nome_tabela

UPDATE:
UPDATE nome_tabela
SET nome_coluna=novo_valor
[, nome_coluna=novo_valor]
WHERE nome_coluna = algum_valor

WHERE:
SELECT nome_coluna(s)
FROM nome_tabela
WHERE condiçao

Espero que gostem.

Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com

Potência / Expoentes em SQL e PL/SQL – Oracle

Fala Pessoal,

Hoje vai mais uma dica de SQL e PL/SQL.

Até o dia de hoje, eu nunca tinha necessitado usar expoente no SQL / PL/SQL, nunca tinha pego nenhum problema em desenvolvimento que precisasse ser usado potência, expoente e tal.

Porém, hoje uma amiga desenvolvedora, Leilah, precisou dessa funcionalidade e aí discutimos um pouco sobre o assunto. Descobri portanto, que no Oracle, não precisamos fazer muita conta e nem usar sintaxes esquisitas para usar potência e elevar um número a uma determinada potência, basta usarmos a função POWER, isso mesmo, funciona assim:

Exemplo SQL:

SQL> select power(2,3) from dual;
POWER(2,3)
----------
8

Neste exemplo, temos 2 elevado a 3, que nos dá 8 como resultado…

Exemplo PL/SQL:

SQL> declare
2 v_num number;
3 begin
4 v_num := power(2,3);
5 dbms_output.put_line('O numero 2 elevado a 3 é: '||to_char(v_num));
6 end;
7 /
O numero 2 elevado a 3 é: 8
Procedimento PL/SQL concluÝdo com sucesso.

Pronto pessoal, fica aí a dica de utilização de potência em PL/SQL.

Espero que gostem.

Grande abraço.

Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com

Notebook com Windows 7 para um DBA

Fala PessoAll,

Creio que muita gente está pensando e vivendo um grande dilema: Migro ou não para o Windows 7.

Comprei uma máquina nova, um Dell Vostro 1320, como todas as máquinas recentes eu tinha direito ao upgrade gratuito do Vista para o Windows 7, e claro eu decidi arriscar instalar o 7 pra ver como sairia no ambiente de trabalho, enfim no dia a dia de um DBA.

Meio receioso… com o CD do XP Professional do lado, para que em caso de problemas, não perdesse tempo, iniciei a instalação.

Primeira coisa: Particionar o HD, claro… C: e D:, arquivos todos no D: e S.O no C: em caso de problemas… Formata apenas o C:, instala o S.O novo e tá tudo certo!

Para este passo, evitando quebrar cabeça, pesquisei alguém que já tivesse feito algo e achei um vídeo no Youtube que explicava direitinho como fazer. O vídeo é Como Formatar um Computador e instalar o Windows 7. Claro que eu já tinha uma noção boa, mas usando Windows XP… o vídeo serve só pra conferir se não tem nenhuma particularidade, e não tem!

Pronto… Windows 7 Ultimate instalado! Rodando 100%

Agora vem o desafio, instalar o Oracle!

Pesquisei em alguns sites, e confirmei que existe uma versão do Oracle para Windows Vista e que funciona no Windows 7. Como todo e qualquer download de produtos Oracle, fui até o OTN (http://otn.oracle.com) e dei uma pesquisada nas versões disponíveis do Database, e encontrei a tal versão para Vista, que pode ser encontrada no link: Oracle 10g para Windows Vista e 2k8, depois do download, fiz a instalação! Ele deu um erro dizendo que o S.O não era homologado para aquela versão do Oracle. Solução: Marcar o checkbox dizendo que tá sabendo, mas quer instalar assim mesmo! Pronto. Instalado, Oracle no ar, rodando, sem problema algum! Já dei shutdown/startup pra ver se ia subir numa boa, e até então tudo certo!

Depois disso vem as nossas queridas ferramentas! Tão importantes no nosso dia a dia!

Até então estão instaladas e funcionando normalmente:

– PL/SQL Developer (FrontEnd Oracle)
– Toad (FrontEnd Oracle)
– UltraEdit (Editor poderoso de Texto)
– UltraVNC (Irmão do VNC fee e mais poderodo)
– One Studio (Ferramenta de controle de solicitações)
– Putty (Ferramenta de conexões com ambientes Unix)

Tudo isso funcionando normalmente, como se fosse o bom e velho XP, só que muito mais rápido e muito mais bonito!

As demais atividades que precisamos fazer como DBA, podemos conectar via Terminal Server e fazer sem problemas, como sempre fizemos! No mais, está tudo certo! Rodando, funcionando e aprovado!

Estou agora desfrutando da novidade, como diria Jessier Quirino: “Eu ando é na frente, feito bengala de cego!”

Abraço a todos.

Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com

Validando Digito Verificador Inscrição Estadual Bahia (BA)

Fala PessoAll,

Bom, como toda e boa pessoa normal, de vez em quando bate a saudade das épocas de desenvolvimento, de quebrar cabeça para fazer alguns códigos “ninja” pra resolver alguns problemas do nosso Dia a Dia (Oracle, rsrs).

Otem me deparei com a demanda de um amigo, precisando fazer uma validação do dígito da Inscrição estadual da Bahia, em PL/SQL. Vamos lá!

Primeiro passo: Pesquisar como se faz a validação do dígito verificador da inscrição estadual da BAHIA!! BAHIA!! Ninguém melhor que a Sefaz/BA pra me dizer isso. Então, fui no site da SEFAZ/BA e achei como fazer a validação, depois foi só cair no PL/SQL de cabeça e colocar pra funcionar. A página que diz como deve ser feita a validação é: http://www.sefaz.ba.gov.br/contribuinte/informacoes_fiscais/doc_fiscal/calculodv.htm.

Segue abaixo a function utilizada para fazer esta validação. Essa function retorna ‘S’ caso esteja OK e ‘N’ caso não seja validado o dígito verificador.


create or replace function valida_dig_inscest_BA(pInscEstadual varchar2) return varchar2 is
v_IE varchar2(10);

idig1 number;
idig2 number;

iRes1 number;
iRes2 number;

cBase1 number;
cBase2 number;
begin
v_IE := rtrim(replace(replace(replace(pInscEstadual, '.', ''), '-', ''), '/', ''));

if length(v_IE) <> 8 then
return('N');
end if;

iRes1 := 0;
iRes2 := 0;

cBase1 := substr(v_IE, 1, 6);
iDig1 := substr(v_IE, 7, 1);
iDig2 := substr(v_IE, 8, 1);

--Se o primeiro dígito for um dos testados, modulo 10, senao, modulo 11
if(substr(cBase1, 1, 1) in (0, 1, 2, 3, 4, 5, 8)) then
--Faz um loop de 7 até 2...
for i in reverse 2 .. 7 loop
--Verifica se o numero encontrado é válido.
if instr('0123456789', SubStr(cBase1, (7-i)+1, 1)) > 0 Then
--Sendo válido, já soma com a multiplicação pelo indice.
ires2 := ires2 + (SubStr(cBase1, (7-i)+1, 1) * i);
else
return('N');
end if;
end loop;

--Recupera o resto do calculo realizado por 10
ires2 := mod(ires2, 10);

--Se for 0, o digito é zero.
if(ires2 = 0) then
ires2 := 0;
--Se não for zero, subtrai o valor de 10
else
ires2 := 10 - ires2;
end if;

--O numero para o calculo do primeiro digito, é os 6 primeiros + o digito 2
cBase2 := cBase1||ires2;

--Faz um loop de 8 até 2...
for i in reverse 2 .. 8 loop
--Verifica se o numero encontrado é válido.
if instr('0123456789', SubStr(cBase2, (8-i)+1, 1)) > 0 Then
--Sendo válido, já soma com a multiplicação pelo indice.
ires1 := ires1 + (SubStr(cBase2, (8-i)+1, 1) * i);
else
return('N');
end if;
end loop;

--Recupera o resto do calculo realizado por 10
ires1 := mod(ires1, 10);

--Se for 0, o digito é zero.
if(ires1 = 0) then
ires1 := 0;
--Se não for zero, subtrai o valor de 10
else
ires1 := 10 - ires1;
end if;

--Se resultado 1 e 2 iguais a digitos 1 e 2, é válido
if(ires1 = idig1 and ires2 = idig2) then
return('S');
else
return('N');
end if;
--Se começa com 6, 7 ou 9
else
--Faz um loop de 7 até 2...
for i in reverse 2 .. 7 loop
--Verifica se o numero encontrado é válido.
if instr('0123456789', SubStr(cBase1, (7-i)+1, 1)) > 0 Then
--Sendo válido, já soma com a multiplicação pelo indice.
ires2 := ires2 + (SubStr(cBase1, (7-i)+1, 1) * i);
else
return('N');
end if;
end loop;

--Recupera o resto do calculo realizado por 11
ires2 := mod(ires2, 11);

--Se for 0, o digito é zero.
if(ires2 = 0) then
ires2 := 0;
--Se não for zero, subtrai o valor de 11
else
ires2 := 11 - ires2;
end if;

--O numero para o calculo do primeiro digito, é os 6 primeiros + o digito 2
cBase2 := cBase1||ires2;

--Faz um loop de 8 até 2...
for i in reverse 2 .. 8 loop
--Verifica se o numero encontrado é válido.
if instr('0123456789', SubStr(cBase2, (8-i)+1, 1)) > 0 Then
--Sendo válido, já soma com a multiplicação pelo indice.
ires1 := ires1 + (SubStr(cBase2, (8-i)+1, 1) * i);
else
return('N');
end if;
end loop;

--Recupera o resto do calculo realizado por 10
ires1 := mod(ires1, 11);

--Se for 0, o digito é zero.
if(ires1 = 0) then
ires1 := 0;
--Se não for zero, subtrai o valor de 10
else
ires1 := 11 - ires1;
end if;

if(ires1 = idig1 and ires2 = idig2) then
return('S');
else
return('N');
end if;
end if;
end;

É isso aí gente, espero que seja útil.

Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com

Oracle RecycleBin

Fala PessoAll,

Bom, esses dias me deparei com um pequeno problema e graças a um “novo” recurso do Banco de Dados Oracle, a partir de sua versão 10g, eu consegui me safar.

Bom, estavamos nós (eu e mais um desenvolvedor) alterando um processo e vimos que no nosso processo uma determinada tabela não era mais necessária, aí conclusão: remove esse lixo! aí vamos nós com aquele velho e bonito comando:

drop table nossa_tabela;

Pronto, tabela dropada.

Para quem não sabe, este comando no Oracle elimina(va) completamente a tabela do banco de dados e você não conseguiria mais (por vias normais e com permissão de um simples mortal desenvolvedor) trazer ela de volta. O que fazer neste caso? Ir falar com aquele simpático e prestativo amigo DBA para voltar um backup e importar apenas esta tabela que se você tiver sorte e ela não for muito utilizada estará com dados da madrugada (teoricamente a hora em que os backups são feitos).

Bom, depois do drop concluído, tentamos compilar o procedimento que estavamos atualizando e… advinha? Lei de Murphi, a tabela era usada em um gigalhão de lugares da rotina e nós não tinhamos visto! mas… graças a era Pós-Oracle 10g e suas new features, “nossos problemas se acabaram-se”.

Existe no 10g um recurso chamado RecycleBin, que no momento em que uma tabela é dropada o banco a mantém por lá, ou seja, quando você dropa, ele grava um registro numa tabela chamada recyclebin (pode ser acessada através do comando select * from recyclebin) informando que a tabela foi “dropada”, qual o novo nome dela e qual era seu nome antigo, como mostrado no registro a seguir:

OBJECT_NAME ORIGINAL_NAME
-------------- ---------------
BIN$ssRbdlWRsCZm8/FvurZ2w==$0 PERMISSAO_USUARIOS

PS: esta tabela possui mais algumas informações como hora do drop, se pode recuperar a tabela, estou mostrando apenas o nome atual e nome original.

Depois de saber disso, podemos facilmente ressucitar esta tabela para que ela volte a ser como era antes, para tal, basta apenas executarmos o comando:

flashback table PERMISSAO_USUARIOS before drop;

E em seguida, teremos a tabela de volta, do lugar de onde nunca deveria ter saído! Rsrsrs.

Espero que esta dica ajude alguns desenvolvedores que por falta de experiência, por falta de atenção ou por confiar na análise de outro desenvolvedor (meu caso) façam uma dessas.

Boa sorte a todos e lembrem: “Deus protege as criancinhas e os desenvolvedores!”.

Grande abraço a todos e um bom final de semana!

Como diz Mauro Halfeld: “E não deixe de aproveitar o final de semana com sua família”.

Atc.
Gerson Júnior