java.sql.SQLException:ORA-03115:nicht unterstützter Netzwerkdatentyp oder Darstellung
Dies wird durch die folgende Anweisung verursacht:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Diese Anweisung besagt, dass Array die Ausgabe sein wird, aber nicht den tatsächlichen Namen des Oracle-Typs als dritten Parameter angegeben hat. Weitere Informationen hierzu finden Sie in diesem Oracle-Dokument.
Wir können die Ausnahme "java.sql.SQLException: ORA-03115: unsupported network datatype or representation
beheben " durch Hinzufügen eines dritten Parameters mit dem tatsächlichen Oracle-Typnamen. In Ihrem Fall ist es NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Aber die obige Anweisung wird während der Ausführung die folgende Ausnahme auslösen:
java.sql.SQLException:ungültiges Namensmuster:SCOTT.NAMESARRAY
Das liegt daran, dass wir den Typ NAMESARRAY
nicht deklariert haben innerhalb der DB. Die obige Ausnahme besagt, dass der Benutzer SCOTT ist, aber Sie können sich mit dem Benutzer Ihrer Wahl verbinden und einen Typ erstellen.
Typ wird in DB erstellt:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
Sobald wir den Typ NAMESARRAY
erstellt haben , wenn wir Ihren Code ohne Änderung ausführen, erhalten wir den folgenden Fehler:
java.sql.SQLException:ORA-06550:Zeile 1, Spalte 180:
PLS-00382:Ausdruck ist vom falschen Typ ORA-06550:Zeile 1, Spalte 173:
PL/SQL:Anweisung ignoriert
Dieser Fehler tritt auf, weil wir den Typ bereits auf Benutzerebene definiert haben, aber wir versuchen, den Typ innerhalb des folgenden Codeblocks erneut zu erstellen:
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;";
Also müssen wir die Typdeklaration daraus entfernen.
String dequeueQuery = "DECLARE " +
" names namesarray;" +
" total integer;" +
" BEGIN " +
" names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
" ? := names;"+
" END;";
Nachdem wir es entfernt haben, wenn wir das Programm nach der Kompilierung ausführen, sollten wir die folgende Ausgabe sehen können:
Kavita
Pritam
Ayan
Rishav
Aziz
Nachfolgend das aktualisierte Programm:
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();}
}
}