java.sql.SQLException:ORA-03115:niet-ondersteund netwerkgegevenstype of representatie
Dit wordt veroorzaakt door de volgende verklaring:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Deze instructie zegt dat array de uitvoer zal zijn, maar specificeerde niet de daadwerkelijke Oracle Type-naam als derde parameter. U kunt dit Oracle-document raadplegen voor meer informatie hierover.
We kunnen de uitzondering "java.sql.SQLException: ORA-03115: unsupported network datatype or representation
oplossen " door een derde parameter toe te voegen met de werkelijke Oracle Type-naam. In uw geval is dit NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Maar de bovenstaande verklaring veroorzaakt de volgende uitzondering tijdens het uitvoeren:
java.sql.SQLException:ongeldig naampatroon:SCOTT.NAMESARRAY
Dit komt omdat we het type NAMESARRAY
niet hebben gedeclareerd binnen DB. De bovenstaande uitzondering zegt dat de gebruiker SCOTT is, maar u kunt verbinding maken met de gebruiker van uw keuze en een type aanmaken.
Type maken in DB:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
Zodra we het type NAMESARRAY
hebben aangemaakt , als we uw code uitvoeren zonder te wijzigen, krijgen we de volgende fout:
java.sql.SQLException:ORA-06550:regel 1, kolom 180:
PLS-00382:uitdrukking is van het verkeerde type ORA-06550:regel 1, kolom 173:
PL/SQL:Verklaring genegeerd
Deze fout is omdat we het type al op gebruikersniveau hebben gedefinieerd, maar we proberen het type opnieuw te maken binnen het volgende codeblok:
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;";
Dus we moeten de typedeclaratie daarvan verwijderen.
String dequeueQuery = "DECLARE " +
" names namesarray;" +
" total integer;" +
" BEGIN " +
" names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
" ? := names;"+
" END;";
Als we het programma na het compileren hebben verwijderd, zouden we de volgende uitvoer moeten kunnen zien:
Kavita
Pritam
Ayan
Rishav
Aziz
Hieronder volgt het bijgewerkte programma:
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();}
}
}