java.sql.SQLEизключение:ORA-03115:неподдържан тип мрежови данни или представяне
Това е причинено от следното изявление:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Това изявление казва, че масивът ще бъде изходът, но не посочва действителното име на Oracle Type като трети параметър. Можете да проверите този Oracle Doc за повече информация по въпроса.
Можем да коригираме изключението „java.sql.SQLException: ORA-03115: unsupported network datatype or representation
" чрез добавяне на трети параметър с действително име на Oracle Type. Във вашия случай това е NAMESARRAY
.
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Но горният оператор ще изведе следното изключение, докато работи:
java.sql.SQLEException:невалиден модел на име:SCOTT.NAMESARRAY
Това е така, защото не сме декларирали типа NAMESARRAY
вътре в БД. Горното изключение казва, че потребителят е SCOTT, но можете да се свържете с потребител по ваш избор и да създадете тип.
Тип създаване в БД:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
След като създадем типа NAMESARRAY
, ако изпълним кода ви без промяна, ще ударим следната грешка:
java.sql.SQLEизключение:ORA-06550:ред 1, колона 180:
PLS-00382:изразът е от грешен тип ORA-06550:ред 1, колона 173:
PL/SQL:Изявлението е игнорирано
Тази грешка е, защото вече сме дефинирали типа на потребителско ниво, но се опитваме да създадем типа отново в следния кодов блок:
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;";
Така че трябва да премахнем декларацията за тип от това.
String dequeueQuery = "DECLARE " +
" names namesarray;" +
" total integer;" +
" BEGIN " +
" names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
" ? := names;"+
" END;";
След като го премахнем, ако изпълним програмата след компилация, трябва да можем да видим следния изход:
Kavita
Pritam
Ayan
Rishav
Aziz
Следва актуализираната програма:
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();}
}
}