Oracle
 sql >> Base de données >  >> RDS >> Oracle

Obtention de ORA-03115 :type de données réseau non pris en charge ou erreur de représentation lors de la récupération d'un tableau de varchar à partir d'un pl/sql anonyme

java.sql.SQLException :ORA-03115 :type de données réseau ou représentation non pris en charge

Cela est dû à l'instruction suivante :

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Cette instruction indique que le tableau sera la sortie, mais n'a pas spécifié le nom réel du type Oracle en tant que troisième paramètre. Vous pouvez consulter ce document Oracle pour plus d'informations à ce sujet.

Nous pouvons corriger l'exception "java.sql.SQLException: ORA-03115: unsupported network datatype or representation " en ajoutant un troisième paramètre avec le nom réel du type Oracle. Dans votre cas, il s'agit de NAMESARRAY .

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

Mais l'instruction ci-dessus lèvera l'exception suivante lors de l'exécution :

java.sql.SQLException :modèle de nom non valide :SCOTT.NAMESARRAY

C'est parce que nous n'avons pas déclaré le type NAMESARRAY à l'intérieur de la BD. L'exception ci-dessus indique que l'utilisateur est SCOTT, mais vous pouvez vous connecter à l'utilisateur de votre choix et créer un type.

Création d'un type dans la base de données :

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

Une fois que nous avons créé le type NAMESARRAY , si nous exécutons votre code sans le modifier, nous rencontrerons l'erreur suivante :

java.sql.SQLException :ORA-06550 :ligne 1, colonne 180 :

PLS-00382 :l'expression est du mauvais type ORA-06550 :ligne 1, colonne 173 :

PL/SQL :Instruction ignorée

Cette erreur est due au fait que nous avons déjà défini le type au niveau de l'utilisateur, mais nous essayons de recréer le type dans le bloc de code suivant :

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

Nous devons donc supprimer la déclaration de type de cela.

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

Après l'avoir supprimé, si nous exécutons le programme après la compilation, nous devrions pouvoir voir la sortie suivante :

Kavita
Pritam
Ayan
Rishav
Aziz

Voici le programme mis à jour :

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