Ошибка «ORA-03115: неподдерживаемый тип сетевых данных или представление» при получении массива varchar из анонимного pl / sql

1

Я получаю исключение "ORA-03115: неподдерживаемый сетевой тип данных или представление" при извлечении типа типа из анонимного блока 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();
        }'

Пожалуйста, помогите мне. Заранее спасибо.

Теги:
jdbc

2 ответа

4
Лучший ответ

java.sql.SQLException: ORA-03115: неподдерживаемый сетевой тип данных или представление

Это вызвано следующим утверждением:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

Этот оператор говорит, что массив будет выводиться, но не указывать фактическое имя типа Oracle в качестве третьего параметра. Вы можете проверить этот документ 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();}
    }
}
  • 0
    Большое спасибо, но у нас нет привилегий для создания нашего пользователя, поэтому я объявил тип. У нас есть альтернатива, чтобы избежать создания типа?
  • 0
    Извините, я не мог придумать альтернативный способ, если используется varray. Для создания нового type пользователю необходимы права доступа к resource . Если у пользователя уже есть права доступа к resource , то однократное создание типа решит все ваши проблемы. Если что-нибудь придет в голову, я обязательно поделюсь. Удачи.
2

Я думаю, вы используете ojdbc14.jar

Попробуйте один раз с ojbc6.jar, и он должен работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню