sql >> Databasteknik >  >> RDS >> Oracle

Hämta ORA-03115:nätverksdatatyp eller representationsfel som inte stöds vid hämtning av array av varchar från anonym pl/sql

java.sql.SQLEundantag:ORA-03115:nätverksdatatyp eller representation som inte stöds

Detta orsakas av följande uttalande:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Detta uttalande säger att array kommer att vara utdata, men angav inte det faktiska Oracle Type-namnet som tredje parameter. Du kan kontrollera detta Oracle-dokument för mer information om detta.

Vi kan fixa undantaget "java.sql.SQLException: ORA-03115: unsupported network datatype or representation " genom att lägga till en tredje parameter med det faktiska Oracle Type-namnet. I ditt fall är det NAMESARRAY .

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

Men ovanstående uttalande kommer att skapa följande undantag under körning:

java.sql.SQLEundantag:ogiltigt namnmönster:SCOTT.NAMESARRAY

Detta beror på att vi inte har deklarerat typen NAMESARRAY inuti DB. Ovanstående undantag säger att användaren är SCOTT, men du kan ansluta till den användare du väljer och skapa typ.

Skapar typ i DB:

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

När vi har skapat typen NAMESARRAY , om vi kör din kod utan att ändra kommer vi att träffa följande fel:

java.sql.SQLEundantag:ORA-06550:rad 1, kolumn 180:

PLS-00382:uttrycket är av fel typ ORA-06550:rad 1, kolumn 173:

PL/SQL:Uttalande ignoreras

Det här felet beror på att vi redan har definierat typen på användarnivå, men vi försöker skapa typen igen i följande kodblock:

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 måste ta bort typdeklarationen från det.

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

Efter att ha tagit bort det om vi kör programmet efter kompilering bör vi kunna se följande utdata:

Kavita
Pritam
Ayan
Rishav
Aziz

Följande är det uppdaterade programmet:

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. Viktig PostgreSQL-övervakning - Del 1

  2. Beräkna medianen med en dynamisk markör

  3. Hur får man alla värden i en kolumn med PHP?

  4. lokala samlingstyper är inte tillåtna i SQL-satser