java.sql.SQLException:ORA-03115:tipo di dati di rete o rappresentazione non supportati
Ciò è causato dalla seguente affermazione:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Questa istruzione dice che l'array sarà l'output, ma non ha specificato il nome del tipo Oracle effettivo come terzo parametro. Puoi controllare questo Oracle Doc per ulteriori informazioni al riguardo.
Possiamo correggere l'eccezione "java.sql.SQLException: ORA-03115: unsupported network datatype or representation
" aggiungendo un terzo parametro con il nome del tipo Oracle effettivo. Nel tuo caso è NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Ma l'istruzione precedente genererà la seguente eccezione durante l'esecuzione:
java.sql.SQLException:modello di nome non valido:SCOTT.NAMESARRAY
Questo perché non abbiamo dichiarato il tipo NAMESARRAY
dentro DB. L'eccezione sopra indica l'utente come SCOTT, ma puoi connetterti all'utente di tua scelta e creare il tipo.
Creazione del tipo in DB:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
Una volta creato il tipo NAMESARRAY
, se eseguiamo il tuo codice senza modificare, visualizzeremo il seguente errore:
java.sql.SQLException:ORA-06550:riga 1, colonna 180:
PLS-00382:l'espressione è di tipo errato ORA-06550:riga 1, colonna 173:
PL/SQL:istruzione ignorata
Questo errore è dovuto al fatto che abbiamo già definito il tipo a livello di utente, ma stiamo cercando di creare nuovamente il tipo all'interno del seguente blocco di codice:
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;";
Quindi, dobbiamo rimuovere la dichiarazione del tipo da quello.
String dequeueQuery = "DECLARE " +
" names namesarray;" +
" total integer;" +
" BEGIN " +
" names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
" ? := names;"+
" END;";
Dopo averlo rimosso, se eseguiamo il programma dopo la compilazione, dovremmo essere in grado di vedere il seguente output:
Kavita
Pritam
Ayan
Rishav
Aziz
Di seguito il programma aggiornato:
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();}
}
}