java.sql.SQLEundantag:ORA-03115:nätverksdatatyp eller representation som inte stöds
Detta orsakas av följande uttalande:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Detta uttalande säger att array kommer att vara utdata, men angav inte det faktiska Oracle Type-namnet som tredje parameter. Du kan kontrollera detta Oracle-dokument för mer information om detta.
Vi kan fixa undantaget "java.sql.SQLException: ORA-03115: unsupported network datatype or representation
" genom att lägga till en tredje parameter med det faktiska Oracle Type-namnet. I ditt fall är det NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Men ovanstående uttalande kommer att skapa följande undantag under körning:
java.sql.SQLEundantag:ogiltigt namnmönster:SCOTT.NAMESARRAY
Detta beror på att vi inte har deklarerat typen NAMESARRAY
inuti DB. Ovanstående undantag säger att användaren är SCOTT, men du kan ansluta till den användare du väljer och skapa typ.
Skapar typ i DB:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
När vi har skapat typen NAMESARRAY
, om vi kör din kod utan att ändra kommer vi att träffa följande fel:
java.sql.SQLEundantag:ORA-06550:rad 1, kolumn 180:
PLS-00382:uttrycket är av fel typ ORA-06550:rad 1, kolumn 173:
PL/SQL:Uttalande ignoreras
Det här felet beror på att vi redan har definierat typen på användarnivå, men vi försöker skapa typen igen i följande kodblock:
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 måste ta bort typdeklarationen från det.
String dequeueQuery = "DECLARE " +
" names namesarray;" +
" total integer;" +
" BEGIN " +
" names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
" ? := names;"+
" END;";
Efter att ha tagit bort det om vi kör programmet efter kompilering bör vi kunna se följande utdata:
Kavita
Pritam
Ayan
Rishav
Aziz
Följande är det uppdaterade programmet:
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();}
}
}