1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Como utilizar corretamente ArrayDescriptor?

Ola Pessoal,

Tudo em ordem?

Minha praia é mais Oracle. Sou novato em Java [ estou curtindo ;-) ] e preciso fazer uma implementação para passar uma collection Java para Oracle.

Perguntei pro meu amigo Google e praticamente em todos os locais tem soluções utilizando ArrayDescriptor. Porém, não está funcionando.

Fiz a implementação e dá erro em tempo de execução, lançando a seguinte exceção: Falha ao converter para representação interna: DT_INI

Abaixo as informações detalhadas de como implementei.

No Oracle, foi criado no owner XXX, os seguintes objetos:

CREATE OR REPLACE TYPE T_KEY_VALUE AS OBJECT
(
  key    VARCHAR2(100)
, value  VARCHAR2(4000)
, CONSTRUCTOR FUNCTION T_KEY_VALUE RETURN SELF AS RESULT
);
/

CREATE OR REPLACE TYPE BODY T_KEY_VALUE AS
  CONSTRUCTOR FUNCTION  T_KEY_VALUE RETURN SELF AS RESULT IS
  BEGIN
    RETURN;
  END;
END;
/

CREATE OR REPLACE TYPE KEY_VALUE_SET IS TABLE OF T_KEY_VALUE;
/

GRANT ALL ON XXX.KEY_VALUE_SET TO YYY WITH GRANT OPTION;
/

GRANT ALL ON XXX.T_KEY_VALUE   TO YYY WITH GRANT OPTION;
/

Minha aplicação Java se conecta com o usuário YYY, e meu código está implementado conforme abaixo:

OBS: retirei alguns trechos e coloquei outros dentro do método para facilitar a pergunta

    public void meuMetodo() throws Exception {
        Connection conn = null;
        PreparedStatement pst = null;

        try {
            conn = ConnectionFactory.getConn();

            String[] pParams = {"DT_INI", "01/05/2015"};

            ArrayDescriptor idArray = ArrayDescriptor.createDescriptor("XXX.T_KEY_VALUE", conn);

            ARRAY paramQuery = new ARRAY(idArray, conn, pParams);

            pst = conn.prepareStatement("{call minhaProc(?,?,?)}");
            pst.setInt(1, 1);
            pst.setString(2, "XPTO");
            pst.setArray(3, paramQuery);

            rs = pst.executeQuery();

             }
        } finally {
            fecharConn(conn, pst, rs, null);
        }

    }

Debugando no Eclipse, o erro ocorre na linha:

ARRAY paramQuery = new ARRAY(idArray, conn, pParams);

Preciso criar este Array na mesma estrutura do TYPE do Oracle e não estou sabendo como.

Espero estar clara a pergunta, e qualquer dica será muito bem-vinda.

Agradeço desde já.

;-)

RESOLVIDO - COMO NÃO TENHO REPUTAÇÃO PARA RESPONDER (NEM MINHA PRÓPRIA PERGUNTA rsrs), SEGUE A SOLUÇÂO

O problema era no tipo de Array que eu estava fazendo no Java. O TYPE Oracle é um Array Bidimensional e eu estava criando um Array Simples no Java para passar ao Oracle.

Mesmo assim, obrigado pela força pessoal.

O código pode ser melhorado ainda, mas ja me atende.

Segue o código corrigido.

    public void meuMetodo(String dataIni, String dataFim) throws Exception {
        ResultSet rs = null;
        Connection conn = null;
        PreparedStatement pst = null;

        try {
            conn = ConnectionFactory.getConn();

            String[][] valoresParametros = new String[2][2];

            valoresParametros[0][0] = "DT_INI";
            valoresParametros[0][1] = dataIni;

            valoresParametros[1][0] = "DT_FIM";
            valoresParametros[1][1] = dataFim;

            ArrayDescriptor idArray = ArrayDescriptor.createDescriptor("XXX.KEY_VALUE_SET", conn);

            ARRAY paramQuery = new ARRAY(idArray, conn, valoresParametros);

            String usr = "XXXXXX";

            pst = conn.prepareStatement("{call minhaProc(?,?,?)}");
            pst.setInt(1, 1);
            pst.setString(2, usr);
            pst.setArray(3, paramQuery);

            rs = pst.executeQuery();
        } finally {
            fecharConn(conn, pst, rs, null);
        }
    }
  • Pessoal, foi mal. Eu estava executando no ambiente errado, e os objetos do Oracle ainda não existiam. Executando no ambiente correto, o erro muda para a linha abaixo: ARRAY paramQuery = new ARRAY(idArray, conn, pNome); E lança a exceção: Falha ao converter para representação interna: DT_INI

    Alguém para ajudar?

    Valeu!

    moisesrs   13 de ago de 2015
  • Ola Moisesrs, acredito que o erro possa estar em passar como String, veja na documentação do preparedStatement que ele possui um setDate(int parameterIndex, Date x) que é um java.sql.Date, caso vc precise de um timestamp também tem, testa ai, acredito que isso possa resolver, abraços.

    Dilnei Cunha   13 de ago de 2015
  • encontrei um artigo do Progress que ele esta muito parecido com o que você já fez, porém ele passa o sql.Date num array de Object veja: request out put parameter

    Dilnei Cunha   13 de ago de 2015
  • Dilnei, consegui resolver. Mas não era problema de tipo de dado. Mudou um pouco o código. Como faço para mostrar o novo código? tem alguma opção aqui no forum? Não estou vendo. Ou simplesmente edito minha postagem e coloca no final o novo código?

    moisesrs   13 de ago de 2015
  • hummm, legal que resolveu :), adiciona como resposta a seu próprio post.

    Dilnei Cunha   13 de ago de 2015
Mostrar todos os 6 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags arrays ou faça a sua própria pergunta.