java - 从匿名 pl/sql 获取 varchar 数组时出现 "ORA-03115: unsupported network datatype or representation"错误

标签 java sql oracle jdbc

我在从匿名 PL/SQL block 中获取类型的 varray 时收到“ORA-03115:不受支持的网络数据类型或表示”异常。

我的代码是:

    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();
        }`

请帮帮我。提前谢谢你。

最佳答案

java.sql.SQLException: ORA-03115: unsupported network datatype or representation

这是由以下语句引起的:

cstmt.registerOutParameter(1, OracleTypes.ARRAY);

此语句表示数组将作为输出,但没有将实际的 Oracle 类型名称指定为第三个参数。你可以查看这个Oracle Doc有关这方面的更多信息。

我们可以通过添加具有实际 Oracle 类型名称的第三个参数来修复异常“java.sql.SQLException: ORA-03115: unsupported network datatype or representation”。在您的情况下,它是 NAMESARRAY

cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");

但是上面的语句在运行时会抛出如下异常:

java.sql.SQLException: invalid name pattern: SCOTT.NAMESARRAY

这是因为我们还没有在 DB 中声明 NAMESARRAY 类型。上面的异常表明用户是 SCOTT,但您可以连接到您选择的用户并创建类型。

在数据库中创建类型:

connect scott/tiger
CREATE OR REPLACE TYPE namesarray AS VARRAY(5) OF VARCHAR2(10) ;
/

一旦我们创建了 NAMESARRAY 类型,如果我们在不更改的情况下执行您的代码,我们将遇到以下错误:

java.sql.SQLException: ORA-06550: line 1, column 180:

PLS-00382: expression is of wrong type ORA-06550: line 1, column 173:

PL/SQL: Statement ignored

此错误是因为我们已经在用户级别定义了类型,但我们试图在以下代码块中再次创建该类型:

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();}
    }
}

关于java - 从匿名 pl/sql 获取 varchar 数组时出现 "ORA-03115: unsupported network datatype or representation"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28579184/

相关文章:

sql - 按显示顺序和父 ID 对列进行排序

mysql - SQL update 在update运行的过程中会影响它的子查询吗?

oracle - 如何反编译 FMX 文件

Java - 如何迭代对象数组列表并将满足特定条件的元素添加到另一个对象数组列表

java - 使用 For 语句创建按钮并将它们添加到面板中?

mysql - 按 id 更新最近更新的行

sql - 经典 ASP 如何引用我用 LEFT 更改的字段

sql - 如何从Oracle中的正则表达式中提取组?

java - 真实世界参数优化

java - 如何在java中的不同类中使用一个对象值