BOA TARDE,
Sou iniciante com PL/SQL e tenho a seguinte dúvida:
eu preciso fazer uma manipulação em uma tabela que tem um campo clob,
dentro desse campo contém um código xml no qual eu tenho que extrair parte de desse código (um bloco pra
ser mais específico) e jogar esse bloco num código html.
A questão é: como eu não conheço muito de manipulação de clob's, como eu faria essa extração?!
desde já obrigado!
SELECT CLOB
-
- Rank: Programador Pleno
- Mensagens: 44
- Registrado em: Qua, 14 Mar 2012 2:37 pm
- stcoutinho
- Moderador
- Mensagens: 850
- Registrado em: Qua, 11 Mai 2011 5:15 pm
- Localização: são Paulo - SP
Oi Amarorafael,
Não sou especialista em XML e CLOB, mas encontrei um ótimo exemplo no site ASKTOM (http://asktom.oracle.com), especificamente neste LINK:
http://asktom.oracle.com/pls/apex/f?p=1 ... 5019878716
Na opinião de Tom Kyte (o criador do ASKTOM), campos CLOB não são muito recomendados para se armazenar código XML. Na falta de uma opção melhor, você pode se basear no exemplo que ele colocou no LINK acima. O método usado por ele para extrair a informação XML do campo CLOB é o XMLTYPE(..).EXTRACT:
O site do ASKTOM é excelente para se aprender PL/SQL em detalhes, pois o Tom Kyte sempre baseia suas explicações em exemplos que você mesmo pode reproduzir depois em seu ambiente.
Espero que a explicação do ASKTOM seja suficiente para esclarecer suas dúvidas. Pode ser que os foristas do GLUFKE possam lhe apresentar outras sugestões.
Boa sorte,
Sergio Coutinho
Não sou especialista em XML e CLOB, mas encontrei um ótimo exemplo no site ASKTOM (http://asktom.oracle.com), especificamente neste LINK:
http://asktom.oracle.com/pls/apex/f?p=1 ... 5019878716
Na opinião de Tom Kyte (o criador do ASKTOM), campos CLOB não são muito recomendados para se armazenar código XML. Na falta de uma opção melhor, você pode se basear no exemplo que ele colocou no LINK acima. O método usado por ele para extrair a informação XML do campo CLOB é o XMLTYPE(..).EXTRACT:
Here is a temporary solution -- long term, use the right type for the data:
ops$tkyte@ORA920LAP> create table t ( x clob );
Table created.
ops$tkyte@ORA920LAP>
ops$tkyte@ORA920LAP> insert into t values (
2 '<REQUEST_DETAIL>
3 <GROUP_TYPE>PR</GROUP_TYPE>
4 <GROUP_NAME>DATA ENGINEERING ASSET MANAGEMENT</GROUP_NAME>
5 <BUS_UNIT_ACRN>SCS-FCAT</BUS_UNIT_ACRN>
6 <PROJ_MGR_ID></PROJ_MGR_ID>
7 <PROJ_MGR_NAME>Roland Roy</PROJ_MGR_NAME>
8 </REQUEST_DETAIL>' );
1 row created.
ops$tkyte@ORA920LAP>
ops$tkyte@ORA920LAP> select
e.x.extract('/REQUEST_DETAIL/GROUP_TYPE/text()').getStringVal()
2 from t e
3 /
select e.x.extract('/REQUEST_DETAIL/GROUP_TYPE/text()').getStringVal()
*
ERROR at line 1: ORA-22806: not an object or REF
ops$tkyte@ORA920LAP> select
xmltype(e.x).extract('/REQUEST_DETAIL/GROUP_TYPE/text()').getStringVal()
2 from t e
3 /
XMLTYPE(E.X).EXTRACT('/REQUEST_DETAIL/GROUP_TYPE/TEXT()').GETSTRINGVAL()
------------------------------------------------------------------------
PR
O site do ASKTOM é excelente para se aprender PL/SQL em detalhes, pois o Tom Kyte sempre baseia suas explicações em exemplos que você mesmo pode reproduzir depois em seu ambiente.
Espero que a explicação do ASKTOM seja suficiente para esclarecer suas dúvidas. Pode ser que os foristas do GLUFKE possam lhe apresentar outras sugestões.
Boa sorte,
Sergio Coutinho
-
- Rank: Programador Pleno
- Mensagens: 44
- Registrado em: Qua, 14 Mar 2012 2:37 pm
perfeito ! consegui retirar um bloco de um xml que esta em um clob usando basicamente esse recurso, então eu montei o seguinte select :
e deu certo!
só que agora eu estou em um outro dilema, eu tenho que acrescentar esse trecho do xml que eu retirei e armazena-lo em um cod html (dentro de um text area) e inserir este cod htm em uma coluna do tipo clob da tabela. o Código html é este:
SELECT
extract(XMLType(coluna_da_tabela), 'bloco_xml', 'xmlns="endereco"')
FROM tabela
WHERE condicao
só que agora eu estou em um outro dilema, eu tenho que acrescentar esse trecho do xml que eu retirei e armazena-lo em um cod html (dentro de um text area) e inserir este cod htm em uma coluna do tipo clob da tabela. o Código html é este:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form method="post">
<input type="submit" value="enviar">
<textarea name="arquivoXml" cols="150" rows="50" style="visibility:hidden" >
TRECHO XML DEVE VIR AQUI!!!!!!
</textarea>
</form>
<script>
document.one.submit();
</script>
</body>
</html>
- stcoutinho
- Moderador
- Mensagens: 850
- Registrado em: Qua, 11 Mai 2011 5:15 pm
- Localização: são Paulo - SP
Ola amaro,
Não saberia exatamente como sugerir uma solução definitiva, mas você pode tentar armazenar este código HTML em um campo VARCHAR2(4000) e tentar usar as funções de busca e substituição em strings, como INSTR e REPLACE.
Talvez o pessoal possa dar alguma outra dica sobre este tema.
Abraços,
Sergio Coutinho
Não saberia exatamente como sugerir uma solução definitiva, mas você pode tentar armazenar este código HTML em um campo VARCHAR2(4000) e tentar usar as funções de busca e substituição em strings, como INSTR e REPLACE.
Talvez o pessoal possa dar alguma outra dica sobre este tema.
Abraços,
Sergio Coutinho
- fsitja
- Rank: OraSauro
- Mensagens: 611
- Registrado em: Seg, 19 Jan 2009 4:29 pm
- Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html
OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist
Tem um pequeno problema... HTML não é igual XML, e é muito mais complexo para fazer o parse, então você não tem como usar as funções de XML do Oracle para te ajudar lá.
Você provavelmente terá que fazer como o STCOUTINHO falou, criar um VARCHAR2 e tratar com função de manipulação de string, INSTR, SUBSTR etc, localizar o início da sua tag:
garantir que não tenha outros tags textarea dentro dela aninhados, verificar a consistência e procurar pelo fim da tag e inserir no meio o XML.
Pode ser até 32767 de comprimento em PL/SQL. Em SQL é 4000 o máximo do VARCHAR2.
Detalhe, a função Extract é uma função deprecada e a Oracle recomenda utilizar a função XMLQUERY:
http://docs.oracle.com/cd/E11882_01/ser ... ons060.htm
http://docs.oracle.com/cd/E11882_01/app ... b13gen.htm
Você provavelmente terá que fazer como o STCOUTINHO falou, criar um VARCHAR2 e tratar com função de manipulação de string, INSTR, SUBSTR etc, localizar o início da sua tag:
<textarea name="arquivoXml" cols="150" rows="50" style="visibility:hidden" >
Pode ser até 32767 de comprimento em PL/SQL. Em SQL é 4000 o máximo do VARCHAR2.
Detalhe, a função Extract é uma função deprecada e a Oracle recomenda utilizar a função XMLQUERY:
http://docs.oracle.com/cd/E11882_01/ser ... ons060.htm
http://docs.oracle.com/cd/E11882_01/app ... b13gen.htm
-
- Rank: Programador Pleno
- Mensagens: 44
- Registrado em: Qua, 14 Mar 2012 2:37 pm
Será que você poderia me dar um exemplo de como eu irei fazer essas manipulações?!
sou novo na área e não estou conseguindo realizar aqui!
se puder ficarei grato!
sou novo na área e não estou conseguindo realizar aqui!
se puder ficarei grato!
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Google [Bot] e 10 visitantes