março 19th, 2009 por MaryMolina
Oi pessoal, voltei… agora pra falar de uma outra maneira de se extrair um XML de tabelas relacionais no banco de dados Oracle. Vou reutilizar a tabela HR.COUNTRIES do post Extraindo um Documento XML a Partir de uma Base Relacional (1). Basta utilizarmos um bloco pl/sql. Vejamos o exemplo:
declare
xml CLOB;
comp sys.dbms_xmlgen.ctxHandle;
txSQL varchar2(200);
begin
txSQL := ‘SELECT * FROM HR.COUNTRIES’;
comp := sys.dbms_xmlgen.newContext(txSQL);
xml := sys.dbms_xmlgen.getXml(comp);
dbms_output.put_line(XML);
end;
/
O resultado da execução do bloco acima é:
<xml>
<ROWSET>
<ROW>
<COUNTRY_ID>AR</COUNTRY_ID>
<COUNTRY>Argentina</COUNTRY>
<REGION_ID>2</REGION_ID>
</ROW>
…
</ROWSET>
</xml>
Espero mais uma vez poder ter ajudado alguém…
Abraços 
Postado Pl/Sql | Sem Comentários »
fevereiro 15th, 2009 por MaryMolina
É muito comum as aplicações recuperarem dados de um banco de dados e transformar os dados recebidos em um arquivo .xml, para vários fins. Neste post, vou mostrar como pular a etapa de a aplicação converter o resultset em um xml, fazendo com que o próprio Oracle retorne o xml desejado.
Seja a tabela COUNTRIES do esquema HR com a seguinte estrutura:
- country_id (char(2) not null)
- country_name (varchar2(40))
- region_id (number)
e com os seguintes dados:
AR Argentina 2
AU Australia 3
BE Belgium 1
BR Brazil 2
CA Canada 2
CH Switzerland 1
CN China 3
DE Germany 1
DK Denmark 1
EG Egypt 4
FR France 1
HK HongKong 3
IL Israel 4
IN India 3
IT Italy 1
JP Japan 3
KW Kuwait 4
MX Mexico 2
NG Nigeria 4
NL Netherlands 1
SG Singapore 3
UK United Kingdom 1
US United States of America 2
ZM Zambia 4
ZW Zimbabwe 4
Vamos extrair um xml simples, que contem simplesmente o conteúdo desta tabela. Observe o comando SQL a seguir:
SELECT XMLElement(”Countries”,
XMLAttributes(country_id as COD),
XMLForest(country_name as NOME,region_id as REGIAO)
),
extract(’/*’) as XML
FROM HR.COUNTRIES;
O resultado será:
Leio o resto desta entrada »
Postado Pl/Sql | 3 Comentários »
fevereiro 1st, 2009 por MaryMolina
Olá pessoal,
Neste post estou falando sobre um assunto abordado por Eduardo Legatti em seu blog (oracle.com.br). Quando li, fiquei surpresa, pois lá ele comenta que é possível criar datafiles sem nome. Isso é, se enviarmos o comando
SQL> alter tablespace users
2 add datafile ‘/u01/oradata/BD01/ ‘
3 size 1m;
o tablespace será alterado e o datafile será criado.
Se listarmos os arquivos do diretório /u01/oradata/BD01, o que vai aparecer no lugar do nome do novo datafile será um espaço vazio…
Portanto, acho bom dar uma olhadinha em sua base de dados para caçar algum datafile perdido sem nome. Mas se encontrarem um arquivinho assim, não é necessário se apavorar. Podemos renomear o datafile. Vamos ver o exemplo para renomear o datafile que criamos aqui:
—> Tornar o tablespace offline
SQL> alter tablespace users offline;
—> Criar uma cópia do arquivo sem nome para users02.dbf
oracle@linux:/u01/oradata/BD01> cp -a ‘ ‘ users02.dbf
—> Alterar o nome do datafile no banco
SQL> alter tablespace users
2 rename datafile
3 ‘/u01/oradata/BD01/ ‘
4 to
5 ‘/u01/oradata/BD01/users02.dbf’;
—> Tornar o tablespace online novamente
SQL> alter tablespace users online;
—> Remover o arquivo sem nome do diretório
oracle@linux:/u01/oradata/BD01> rm ‘ ‘
Como é possível ver, estamos usando Linux. No windows é um pouco mais difícil criar um datafile sem nome.
Abraço a todos
Postado Administração do BD | Sem Comentários »
janeiro 6th, 2009 por MaryMolina
Olá pessoal,
Neste post, pretendo ensinar como fazer carga de caracteres especiais no Oracle. Para ficar mais fácil entender o problema e também sua solução, vou usar um exemplo: suponhamos que o sistema que está sendo desenvolvido armazene, em um banco de dados, textos contendo caracteres especiais.
Vamos imaginar a tabela CODIGOS que possui um campo chamado Id, number(10) e outro campo chamado Conteudo, varchar2(255).
Se tentarmos inserir o texto Isso é um &teste na tabela, o caracter & será interpretado como entrada de dados pelo teclado. Então, qual seria a solução? É simples: empregamos um caracter como escape. Quando utilizamos um caracter como escape, o caracter se segue este é interpretado como um caracter comum, como A, 1, etc. A escolha do caracter de escape merece algum cuidado, por exemplo, deve ser um caracter que não é utilizado em nenhum lugar no texto a ser inserido, pois um caracter de escape é um caracter que não é inserido, servindo apenas para avisar que o próximo caracter equivale a um alfanumérico. Como na inserção que iremos fazer não existe a ocorrência de !. vamos elegê-lo para ser nosso escape. Logo, a solução fica assim:
SET ESCAPE !
insert into CODIGOS (Id,Conteudo) values (1,’Isso é um !&teste’);
SET ESCAPE OFF
O mesmo recurso deve ser utilizado para inserção de caracteres como símbolo de parágrafo (aqueles ss um sobre o outro), símbolo de grau, símbolos de exponenciação, etc.
Vamos a outra situação, vamos inserir a frase Eles criam galinhas d’angola. Agora, como vamos fazer pra que o ‘ não seja interpretado como fim da string a ser inserida? A solução é ainda mais simples: basta duplicar o símbolo ‘. A solução fica assim:
insert into CODIGOS (Id,Conteudo) values (2,’Eles criam galinhas d”angola.’);
Por hoje é só. Espero ter ajudado….
Abraços
Postado Pl/Sql | 4 Comentários »
dezembro 16th, 2008 por MaryMolina
Um certo dia, um dos analistas me pediu pra remover uma tabela do banco de dados, a qual não seria mais utilizada pelo sistema. Então me escreveu: Por favor, remova a tabela xxx. No entanto, a tabela que deveria ser removida era a xxxy, ou seja, outra tabela…… Embora eu tenha sempre um backup à mão e também os scripts de criação de todo banco, o que eu poderia fazer pra rapidamente voltar a tabela para o banco pra que a equipe de desenvolvimento não ficasse parada? Se eu utilizasse o script, os dados estariam perdidos, e se eu voltasse o backup (tirado na noite anterior), todos os dados cadastrados naquela manhã também seriam perdidos. A solução foi usar um importante recurso do Oracle 10g, o FLASHBACK. Com o Flashback, conseguimos recuperar as tabelas que são removidas (dropadas), desde que elas estejam na lixeira.
A forma de se recuperar a tabela é bastante simples:
FLASHBACK TABLE <nome_do_esquema>.”<item_da_lixeira>” TO BEFORE DROP;
O nome do esquema é necessário sempre que você está fazendo uma operação em objetos de outros esquemas. O item da lixeira é o nome da tabela que foi removida. Quando executamos o comando drop table, a tabela não é removida totalmente do banco, ela continua inclusive no mesmo esquema, mas ela recebe um outro nome com o prefixo BIN$$, atribuído pelo próprio SGBD durante a operação de drop. E é esse o nome que iremos usar para recuperá-la, o qual pode ser consultado através da view RECYCLEBIN.
Vamos ver um exemplo:
FLASHBACK TABLE MARY.”BIN$$aXTfzqrmrGO0UGOFN34mOw==$0″ TO BEFORE DROP;
É importante ressaltar que uma tabela pode ser ainda acessada e consultada após ser dropada, desde que não se limpe a lixeira… Além disso, o Flashback pode ser usado também para recuperar tabelas alteradas por engano, mas isso é assunto pra outro post 
Para relembrar, podemos limpar a tabela excluída por drop com o comando:
PURGE TABLE MARY.”BIN$$aXTfzqrmrGO0UGOFN34mOw==$0″;
Espero ter contribuído com mais essa dica….
Abraços
Postado Pl/Sql | 3 Comentários »
dezembro 15th, 2008 por MaryMolina
Alguém já tentou inserir um registro com um campo do tipo varchar2 com mais de 4000 caracteres? Parece exagero, mas isso é mais comum do que se pensa. Qualquer descrição, mesmo sendo simples, pode facilmente superar este limite. Um campo do tpo varchar2 pode ter até no máximo 32767 caracteres. Acima desse valor, temos que partir para os registros do tipo lob (large objects), que são blob e clob, mas isso é assunto pra um outro post…
Como eu ia dizendo, inserir um valor cujo tamanho ultrapassa 4000 caracteres não é uma tarefa tão trivial, e se você não acredita, tente fazer isso usando o SqlDeveloper ou o próprio SqlPlus… o erro será o mesmo, que afirma que o campo é longo demais.
A solução que resolveu meu problema foi colocar isso num bloco pl/sql. A solução toda ficou assim:
declare
meuTexto varchar2(32767);
begin
meuTexto := ‘Aqui eu coloco o texto enorme!………’;
insert into meuOwner.minhaTabela (meuCampo)
values (meuTexto);
end;
Dessa forma o erro não irá mais acontecer…. Espero que essa dica possa ter ajudado. E deixe sempre suas dúvidas e comentários.
Até a próxima.
Abraço a todos
Postado Pl/Sql | Sem Comentários »
dezembro 15th, 2008 por MaryMolina
Olá pessoal,
Estou criando este blog para poder compartilhar as coisas que aprendi e que ainda estou aprendendo durante os anos de trabalho como dba, programadora PL/SQL, analista de sistemas, “modeladora” de dados, e assim por diante. Quem trabalha na área sabe que, no dia a dia, aprendemos e fazemos um pouco de tudo, pois sempre dão uma tarefa nova pra desenvolver. Espero poder contribuir e aprender com todos…
Grande abraço
Mariangela Molina
Postado Sem categoria | Sem Comentários »