Oracle
 sql >> Database >  >> RDS >> Oracle

Ottenere ORA-03115:tipo di dati di rete non supportato o errore di rappresentazione durante il recupero dell'array di varchar da pl/sql anonimo

java.sql.SQLException:ORA-03115:tipo di dati di rete o rappresentazione non supportati

Ciò è causato dalla seguente affermazione:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Questa istruzione dice che l'array sarà l'output, ma non ha specificato il nome del tipo Oracle effettivo come terzo parametro. Puoi controllare questo Oracle Doc per ulteriori informazioni al riguardo.

Possiamo correggere l'eccezione "java.sql.SQLException: ORA-03115: unsupported network datatype or representation " aggiungendo un terzo parametro con il nome del tipo Oracle effettivo. Nel tuo caso è NAMESARRAY .

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

Ma l'istruzione precedente genererà la seguente eccezione durante l'esecuzione:

java.sql.SQLException:modello di nome non valido:SCOTT.NAMESARRAY

Questo perché non abbiamo dichiarato il tipo NAMESARRAY dentro DB. L'eccezione sopra indica l'utente come SCOTT, ma puoi connetterti all'utente di tua scelta e creare il tipo.

Creazione del tipo in DB:

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

Una volta creato il tipo NAMESARRAY , se eseguiamo il tuo codice senza modificare, visualizzeremo il seguente errore:

java.sql.SQLException:ORA-06550:riga 1, colonna 180:

PLS-00382:l'espressione è di tipo errato ORA-06550:riga 1, colonna 173:

PL/SQL:istruzione ignorata

Questo errore è dovuto al fatto che abbiamo già definito il tipo a livello di utente, ma stiamo cercando di creare nuovamente il tipo all'interno del seguente blocco di codice:

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;";

Quindi, dobbiamo rimuovere la dichiarazione del tipo da quello.

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

Dopo averlo rimosso, se eseguiamo il programma dopo la compilazione, dovremmo essere in grado di vedere il seguente output:

Kavita
Pritam
Ayan
Rishav
Aziz

Di seguito il programma aggiornato:

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