Procedure retorna Dados Oracle / SQLServer

2 respostas
A

Estou desenvolvendo uma aplicação e estou com um problema enorme.
A politica da empresa requer que os dados sejam acessados apenas via stored procedures… pra select, insert, update e delete. A mesma aplicação roda em algumas unidades em Oracle e/ou SQLServer . Para fazer insert, updates e deletes tudo bem… mas quando chega na parte do select tudo se complica… No SQLServer, vc cria uma procedure e ela retorna um resultSet… No Oracle isso não é possível. Como faço para executar uma procedure que retorne dados, de maneira padrão? Isso quer dizer… qual a maneira correta de criar as procedures e qual a maneira correta de chama-las para o negócio ficar portavel… Não gostaria muito de ter que usar os patterns tipo Abstract Factory ou coisa do tipo. Afinal JDBC é ou não portável? Terei que utilizar apenas select puro? Por que o desempenho fica comprometido nesse caso… Stored Procedures sào muito mais rápidas… rs.

Aron Teixeira Rodrigues

2 Respostas

E
NO ORACLE
-- Package specification
Package PKG_WEB_COTACAO
  IS
  -- Variaveis Globais da package
  TYPE row_cursor IS REF CURSOR;
END;

-- Package body
Package Body     PKG_TESTE

  FUNCTION FC_UNIDADES_FEDERATIVAS
       -- Parametros de saida
      (
       p_num_error         OUT VARCHAR2,               -- Numero do erro
       p_msg_error         OUT VARCHAR2                -- Mensagem de erro
      ) RETURN row_cursor

     IS
       v_cursor_retorno     row_cursor;                 -- Cursor de retorno

  BEGIN
      -- Inicializacao de variaveis/parametros
      p_num_error := '0';
      p_msg_error := '';

      OPEN v_cursor_retorno 
       FOR SELECT unidadeFederativa
             FROM cad_uf;

      RETURN v_cursor_retorno;

  EXCEPTION
      WHEN NO_DATA_FOUND THEN
           p_num_error := '-20100';
           p_msg_error := 'Não há Unidades Federativas cadastradas!';
      WHEN OTHERS THEN
           p_num_error := SQLCODE;
           p_msg_error := SQLERRM;
  END;

END;
NO JAVA
try {

        //Cria string de conexão ao banco de dados.
        java.sql.Connection conn = DbConnection.connection(amb);

        //-- Cria o objeto de acesso a procedure.
        CallableStatement st = conn.prepareCall("{? = call PKG_TESTE.FC_UNIDADES_FEDERATIVAS(?,?)}");

        //-- Recordset de saida.
        st.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);

        //-- Parâmetros de saida.
        st.registerOutParameter(2, java.sql.Types.VARCHAR);
        st.registerOutParameter(3, java.sql.Types.VARCHAR);

        //-- Executa a procedure.
        st.execute();

        //-- Resultset.
        ResultSet rs = (ResultSet) st.getObject(1);

        //-- Vector que armazenará Unidades Federativas.
        Vector unidadesFederativas = new Vector();

        //-- Carrega as variáveis com o número
        //-- e a mensagem de erro.
        //-- Se "sNumError" for igual a zero (0)
        //-- não houve erro.
        String sNumError = st.getString(2);
        String sMsgError = st.getString(3);



        //Loop com todos os registros encontrados.
        while (rs.next()) {

            //Carrega as Unidades Federativas no vector.
            unidadesFederativas.addElement(rs.getString("unidadeFederativa"));

        }

        rs.close();
        st.close();
        conn.close();

        // Captura erros SQL
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
A

Eu testei este ontem.. . mas mesmo assim, muito obrigado... Essa abordagem funciona no Oracle, mas não é padrão :(

//-- Cria o objeto de acesso a procedure.
        CallableStatement st = conn.prepareCall("{? = call PKG_TESTE.FC_UNIDADES_FEDERATIVAS(?,?)}");

        //-- Recordset de saida.
        st.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);

        //-- Parâmetros de saida.

Isso me obriga a codificação dependente do banco de dados.

Criado 15 de fevereiro de 2005
Ultima resposta 15 de fev. de 2005
Respostas 2
Participantes 2