Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Pobieranie ORA-03115:nieobsługiwany typ danych sieciowych lub błąd reprezentacji podczas pobierania tablicy varchar z anonimowego pl/sql

java.sql.SQLException:ORA-03115:nieobsługiwany typ danych lub reprezentacja sieci

Jest to spowodowane następującym stwierdzeniem:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Ta instrukcja mówi, że wynikiem będzie tablica, ale nie określono rzeczywistej nazwy typu Oracle jako trzeciego parametru. Więcej informacji na ten temat znajdziesz w tym Oracle Doc.

Możemy naprawić wyjątek „java.sql.SQLException: ORA-03115: unsupported network datatype or representation ", dodając trzeci parametr z rzeczywistą nazwą typu Oracle. W twoim przypadku jest to NAMESARRAY .

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

Ale powyższa instrukcja wyrzuci następujący wyjątek podczas działania:

java.sql.SQLException:nieprawidłowy wzorzec nazwy:SCOTT.NAMESARRAY

Dzieje się tak, ponieważ nie zadeklarowaliśmy typu NAMESARRAY wewnątrz DB. Powyższy wyjątek mówi, że użytkownik to SCOTT, ale możesz połączyć się z wybranym użytkownikiem i utworzyć typ.

Tworzenie typu w DB:

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

Po utworzeniu typu NAMESARRAY , jeśli wykonamy Twój kod bez zmian, pojawi się następujący błąd:

java.sql.SQLException:ORA-06550:wiersz 1, kolumna 180:

PLS-00382:wyrażenie jest złego typu ORA-06550:wiersz 1, kolumna 173:

PL/SQL:Instrukcja zignorowana

Ten błąd jest spowodowany tym, że już zdefiniowaliśmy typ na poziomie użytkownika, ale próbujemy ponownie utworzyć typ w następującym bloku kodu:

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

Dlatego musimy usunąć z tego deklarację typu.

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

Po jego usunięciu, jeśli wykonamy program po kompilacji, powinniśmy zobaczyć następujące wyjście:

Kavita
Pritam
Ayan
Rishav
Aziz

Oto zaktualizowany 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Instalowanie klienta Oracle Warehouse Builder 11g R2

  2. Java JDBC - Jak połączyć się z Oracle za pomocą tnsnames.ora

  3. Jak włączyć rejestrowanie dla instrukcji SQL podczas korzystania z JDBC?

  4. Schemat inżynierii odwrotnej (wyrocznia) do ERD

  5. FLOOR() Funkcja w Oracle