Trabalhar com retorno XML do Oracle

4 respostas
thianolima

Estou desenvolvendo um sistema online com Java + Flex + Oracle, e estou com problema para conseguir ler uma SQLX do oracle em java.
rodo a seguinte sql no oracle

SELECT
  XMLELEMENT("NODE", 
    XMLATTRIBUTES(
      NVL(M.MEN_RECNO, 0) AS "MEN_RECNO",
      NVL(M.MEN_DESCRICAO, 0) AS "MEN_DESCRICAO",
      NVL(M.MEN_RECNO_PAI, 0) AS "MEN_RECNO_PAI"
    ),
    ( SELECT XMLAGG(
               XMLELEMENT("NODE",
                 XMLATTRIBUTES(
                   NVL(F.MEN_RECNO, 0) AS "MEN_RECNO",
                   NVL(F.MEN_DESCRICAO, 0) AS "MEN_DESCRICAO",
                   NVL(F.MEN_RECNO_PAI, 0) AS "MEN_RECNO_PAI",
                   P.PER_ALTERAR AS "PER_ALTERAR",
                   P.PER_INSERIR AS "PER_INSERIR",
                   P.PER_EXCLUIR AS "PER_EXCLUIR"
                 )
               )
               ORDER BY F.MEN_ORDEM
             )        
      FROM MENU F 
      WHERE F.MEN_RECNO_PAI = M.MEN_RECNO        
    )  
  ) AS MENU
FROM MENU M
INNER JOIN PERMISSAO P ON P.MEN_RECNO = M.MEN_RECNO
WHERE M.MEN_RECNO_PAI IS NULL AND M.MOD_RECNO = '015' AND P.GUS_RECNO = 1
ORDER BY M.MEN_ORDEM

A SQL me retorna certinho oq preciso para montar o menu da minha aplicação, dai con esse passo pronto fui pro java para fazer um servlet aonde escrevesse isso e eu consumisse no flex para montar um treeview.
Bom antes de montar o servlet fui fazer uns teste com uma classe simples em java que esta abaixo

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLXML;
import java.sql.Statement;


public class TesteConexao {
	public static void main(String[] args) throws SQLException {
		DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//127.0.0.1:8080/banco", "sys", "123");
        Statement stmt = conn.createStatement();
        
        String sql = 
	        "	SELECT"+
	        "	  XMLELEMENT(" + '"' + "NODE" + '"' + "," + 
	        " 	    XMLATTRIBUTES("+
	        " 	      NVL(M.MEN_RECNO, 0) AS " + '"' + "MEN_RECNO" + '"' + "," +
	        "	      NVL(M.MEN_DESCRICAO, 0) AS " + '"' + "MEN_DESCRICAO" + '"' + "," +
	        "	      NVL(M.MEN_RECNO_PAI, 0) AS " + '"' + "MEN_RECNO_PAI" + '"' +
	        "	    )," +
	        "	    ( SELECT XMLAGG("+
	        "	               XMLELEMENT(" + '"' + "NODE" + '"' + ","+
	        "	                 XMLATTRIBUTES("+
	        "	                   NVL(F.MEN_RECNO, 0) AS " + '"' + "MEN_RECNO" + '"' + "," +
	        "	                   NVL(F.MEN_DESCRICAO, 0) AS " + '"' + "MEN_DESCRICAO" + '"' + "," +
	        "	                   NVL(F.MEN_RECNO_PAI, 0) AS " + '"' + "EN_RECNO_PAI" + '"' + ","+
	        "	                   P.PER_ALTERAR AS " + '"' + "PER_ALTERAR" + '"' + "," +
	        "	                   P.PER_INSERIR AS " + '"' + "PER_INSERIR" + '"' + "," +
	        "	                   P.PER_EXCLUIR AS " + '"' + "PER_EXCLUIR" + '"' +
	        "	                 )"+
	        "	               )"+
	        "	               ORDER BY F.MEN_ORDEM"+
	        "	             )"+        
	        "	      FROM MENU F"+ 
	        "	      WHERE F.MEN_RECNO_PAI = M.MEN_RECNO"+        
	        "	    )"+
	        "	  ) AS MENU" +
	        "	FROM MENU M"+
	        "	INNER JOIN PERMISSAO P ON P.MEN_RECNO = M.MEN_RECNO"+
	        "	WHERE M.MEN_RECNO_PAI IS NULL AND M.MOD_RECNO = '015' AND P.GUS_RECNO = 1"+
	        "	ORDER BY M.MEN_ORDEM";       	
                
        ResultSet rset = stmt.executeQuery(sql);  
               
        while (rset.next())
        {  	
        	System.out.println(rset.getString());
        }
        
        stmt.close();

	}
}

E me deparei com os eguinte problema, o java executa a sql sem dar erro mas qdo vai mostrar o conteudo do rset ele mostra nul.
A sql que eu monto dinamicamente esta certa pois eu ja dei um System.out.println e oq mostrou rodou perfeitamente no oracle.
Alguem poderia me dizer qual oq estou fazendo errado???

4 Respostas

T

Você mudou alguma coisa quando foi postar este programa. Seria “rset.getString (1)” ? Ou então você está usando o Eclipse e ele, como de costume, aceitou um programa com erros de compilação e só vai reclamar quando executarmos o programa?

De qualquer maneira, o objeto XML retornado não é uma String, pelo que suponho, e sim um objeto específico do Oracle.

http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96620/xdb09jav.htm#1656

thianolima

Esqueci mesmo de colocar o numero 1 pq eu alterei umas coisas antes de colocar
Mas mesmo assim ele esta me retornando 2 linhas null onde teria q retornar preenchidas igual abaixo

<NODE MEN_RECNO="015015" MEN_DESCRICAO="Cadastros" MEN_RECNO_PAI="0"><NODE MEN_RECNO="015016" MEN_DESCRICAO="Funcionários" MEN_RECNO_PAI="015015" PER_ALTERAR="N" PER_INSERIR="N" PER_EXCLUIR="N"></NODE><NODE MEN_RECNO="015017" MEN_DESCRICAO="E-mail" MEN_RECNO_PAI="015015" PER_ALTERAR="N" PER_INSERIR="N" PER_EXCLUIR="N"></NODE></NODE> <NODE MEN_RECNO="015018" MEN_DESCRICAO="Controle de Acessos" MEN_RECNO_PAI="0"><NODE MEN_RECNO="015019" MEN_DESCRICAO="Grupo de Usuários" MEN_RECNO_PAI="015018" PER_ALTERAR="N" PER_INSERIR="N" PER_EXCLUIR="N"></NODE><NODE MEN_RECNO="015020" MEN_DESCRICAO="Usuários" MEN_RECNO_PAI="015018" PER_ALTERAR="N" PER_INSERIR="N" PER_EXCLUIR="N"></NODE></NODE>

thianolima

Consegui !!!
Fiz um cast no oracle para retornar uma varchar2(1000)

T

Hum… esses casts são sinal de “funciona agora, mas se o menu ficar maior”?

Criado 9 de abril de 2009
Ultima resposta 9 de abr. de 2009
Respostas 4
Participantes 2