sql >> Base de Datos >  >> RDS >> Oracle

Obtener ORA-03115:tipo de datos de red no compatible o error de representación al obtener una matriz de varchar de pl/sql anónimo

java.sql.SQLException:ORA-03115:representación o tipo de datos de red no compatible

Esto es causado por la siguiente declaración:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Esta declaración dice que la matriz será la salida, pero no especificó el nombre del tipo de Oracle real como tercer parámetro. Puede consultar este documento de Oracle para obtener más información al respecto.

Podemos corregir la excepción "java.sql.SQLException: ORA-03115: unsupported network datatype or representation " agregando un tercer parámetro con el nombre de Oracle Type real. En su caso, es NAMESARRAY .

cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");

Pero la declaración anterior arrojará la siguiente excepción mientras se ejecuta:

java.sql.SQLException:patrón de nombre no válido:SCOTT.NAMESARRAY

Esto se debe a que no hemos declarado el tipo NAMESARRAY dentro de DB. La excepción anterior dice que el usuario es SCOTT, pero puede conectarse con el usuario de su elección y crear un tipo.

Creando tipo en DB:

connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/

Una vez creamos el tipo NAMESARRAY , si ejecutamos su código sin cambiar nos daremos el siguiente error:

java.sql.SQLException:ORA-06550:línea 1, columna 180:

PLS-00382:la expresión es de tipo incorrecto ORA-06550:línea 1, columna 173:

PL/SQL:Declaración ignorada

Este error se debe a que ya hemos definido el tipo a nivel de usuario, pero estamos intentando crear el tipo nuevamente dentro del siguiente bloque 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;";

Entonces, necesitamos eliminar la declaración de tipo de eso.

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

Después de eliminarlo, si ejecutamos el programa después de la compilación, deberíamos poder ver el siguiente resultado:

Kavita
Pritam
Ayan
Rishav
Aziz

El siguiente es el programa actualizado:

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();}
    }
}