Ошибка "ORA-03115: неподдерживаемый тип сетевых данных или представление" при получении массива varchar из анонимного pl/sql
Я получаю исключение "ORA-03115: неподдерживаемый тип сетевых данных или представление" при извлечении varray типа из анонимного блока PL/SQL.
мой код:
Connection con = null;
CallableStatement cstmt = null;
ResultSet rs = null;
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;";
try{
con = getConnection();
con.setAutoCommit(false);
cstmt =(OracleCallableStatement )con.prepareCall(dequeueQuery);
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
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();
}catch (Exception e) {
try {
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}`
Пожалуйста, помогите мне. Заранее спасибо.
2 ответа
java.sql.SQLException: ORA-03115: неподдерживаемый сетевой тип данных или представление
Это вызвано следующим утверждением:
cstmt.registerOutParameter(1, OracleTypes.ARRAY);
Это утверждение говорит, что массив будет выходным, но не указывал фактическое имя Oracle Type в качестве третьего параметра. Вы можете проверить этот документ Oracle для получения дополнительной информации об этом.
Мы можем исправить исключение "java.sql.SQLException: ORA-03115: unsupported network datatype or representation
"добавив третий параметр с фактическим именем типа Oracle. В вашем случае это NAMESARRAY
,
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");
Но вышеприведенное утверждение при запуске выдает следующее исключение:
java.sql.SQLException: неправильный шаблон имени: SCOTT.NAMESARRAY
Это потому, что мы не объявили тип NAMESARRAY
внутри БД. Вышеупомянутое исключение говорит, что пользователь SCOTT, но вы можете подключиться к выбранному вами пользователю и создать тип.
Создание типа в БД:
connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/
После того, как мы создаем тип NAMESARRAY
, если мы выполним ваш код без изменений, мы увидим следующую ошибку:
java.sql.SQLException: 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/tiger@//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();}
}
}
Я думаю, что вы используете ojdbc14.jar
Попробуйте один раз с ojbc6.jar, и он должен работать.