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

Hentning af ORA-03115:ikke-understøttet netværksdatatype eller repræsentationsfejl under hentning af array af varchar fra anonym pl/sql

java.sql.SQLEundtagelse:ORA-03115:ikke-understøttet netværksdatatype eller repræsentation

Dette skyldes følgende udsagn:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Denne erklæring siger, at array vil være outputtet, men angivede ikke det faktiske Oracle Type-navn som tredje parameter. Du kan tjekke dette Oracle-dokument for at få flere oplysninger om dette.

Vi kan rette undtagelsen "java.sql.SQLException: ORA-03115: unsupported network datatype or representation " ved at tilføje en tredje parameter med det faktiske Oracle Type-navn. I dit tilfælde er det NAMESARRAY .

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

Men ovenstående sætning vil give følgende undtagelse, mens den kører:

java.sql.SQLEundtagelse:ugyldigt navnemønster:SCOTT.NAMESARRAY

Dette skyldes, at vi ikke har erklæret typen NAMESARRAY inde i DB. Ovenstående undtagelse siger brugeren som SCOTT, men du kan oprette forbindelse til brugeren efter eget valg og oprette type.

Opretter type i DB:

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

Når vi har oprettet typen NAMESARRAY , hvis vi udfører din kode uden at ændre, vil vi ramme følgende fejl:

java.sql.SQLEundtagelse:ORA-06550:linje 1, kolonne 180:

PLS-00382:udtryk er af forkert type ORA-06550:linje 1, kolonne 173:

PL/SQL:Udsagn ignoreret

Denne fejl skyldes, at vi allerede har defineret typen på brugerniveau, men vi forsøger at oprette typen igen i følgende kodeblok:

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

Så vi er nødt til at fjerne typeerklæringen fra det.

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

Efter at have fjernet det, hvis vi udfører programmet efter kompilering, skulle vi være i stand til at se følgende output:

Kavita
Pritam
Ayan
Rishav
Aziz

Følgende er det opdaterede program:

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


  1. Hvordan kommer man i gang med SQLCipher til Android?

  2. Udfyld en rulleliste fra en mySQL-tabel i PHP

  3. ActiveRecord::AdapterNotSpecified databasekonfiguration angiver ikke adapter

  4. Grundlæggende om tabeludtryk, del 7 – CTE'er, optimeringsovervejelser