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