Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Obtendo ORA-03115:tipo de dados de rede não suportado ou erro de representação ao buscar array de varchar de pl/sql anônimo


java.sql.SQLException:ORA-03115:representação ou tipo de dados de rede não suportado

Isso é causado pela seguinte declaração:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Esta declaração diz que array será a saída, mas não especificou o nome real do Oracle Type como terceiro parâmetro. Você pode verificar este Oracle Doc para obter mais informações sobre isso.

Podemos corrigir a exceção "java.sql.SQLException: ORA-03115: unsupported network datatype or representation " adicionando um terceiro parâmetro com o nome real do Oracle Type. No seu caso, é NAMESARRAY .
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");

Mas a instrução acima lançará a seguinte exceção durante a execução:

java.sql.SQLException:padrão de nome inválido:SCOTT.NAMESARRAY

Isso ocorre porque não declaramos o tipo NAMESARRAY dentro do DB. A exceção acima diz que o usuário é SCOTT, mas você pode se conectar ao usuário de sua escolha e criar o tipo.

Criando tipo no banco de dados:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/

Uma vez que criamos o tipo NAMESARRAY , se executarmos seu código sem alterar, encontraremos o seguinte erro:

java.sql.SQLException:ORA-06550:linha 1, coluna 180:

PLS-00382:a expressão é do tipo errado ORA-06550:linha 1, coluna 173:

PL/SQL:Instrução ignorada

Este erro ocorre porque já definimos o tipo no nível do usuário, mas estamos tentando criar o tipo novamente dentro do seguinte bloco de código:
String dequeueQuery = "DECLARE " +
            " type namesarray IS VARRAY(5) OF VARCHAR2(10); " +
            " names namesarray;" +
            "   total integer;" +
            "   BEGIN " +
            "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
            "   ? := names;"+
            " END;";

Então, precisamos remover a declaração de tipo disso.
String dequeueQuery = "DECLARE " +
            " names namesarray;" +
            "   total integer;" +
            "   BEGIN " +
            "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
            "   ? := names;"+
            " END;";

Depois de removê-lo, se executarmos o programa após a compilação, poderemos ver a seguinte saída:
Kavita
Pritam
Ayan
Rishav
Aziz

Segue o programa atualizado:
import java.io.*;
import java.sql.*;
import oracle.jdbc.*;

public class DBQC {
   public static void main(String[] args) {
   try {
      Connection con=null;
      Class.forName("oracle.jdbc.OracleDriver");
      String connStr = "jdbc:oracle:thin:scott/[email protected]//dbhost:1521/dbsrvc";
      con=DriverManager.getConnection(connStr);
      if(con != null)
      {
         System.out.println("Connection succeeded");

         String dequeueQuery = "DECLARE " +
            " names namesarray;" +
            "   total integer;" +
            "   BEGIN " +
            "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
            "   ? := names;"+
            " END;";

         CallableStatement cstmt = null;
         con.setAutoCommit(false);
         cstmt =(OracleCallableStatement)con.prepareCall(dequeueQuery);

         cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
         boolean b = cstmt.execute();
         Array arr = cstmt.getArray(1);

         String[] recievedArray = (String[]) arr.getArray();
         for (int i = 0; i < recievedArray.length; i++)
             System.out.println(recievedArray[i]);

         con.commit();
      }
      con.close();
    } catch(Exception e){e.printStackTrace();}
    }
}