首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从匿名pl/sql获取varchar数组时出现"ORA-03115:不支持的网络数据类型或表示“错误

从匿名pl/sql获取varchar数组时出现"ORA-03115:不支持的网络数据类型或表示“错误
EN

Stack Overflow用户
提问于 2015-02-18 16:37:59
回答 2查看 18.7K关注 0票数 4

从匿名PL/SQL块获取类型的varray时,我得到了"ORA-03115:不支持的网络数据类型或表示“异常。

我的代码是:

代码语言:javascript
复制
    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();
        }`

请帮帮我。提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-18 20:04:55

java.sql.SQLException: ORA-03115:不支持的网络数据类型或表示

这是由以下语句引起的:

代码语言:javascript
复制
cstmt.registerOutParameter(1, OracleTypes.ARRAY);

这条语句说数组将是输出,但没有指定实际的Oracle Type name作为第三个参数。有关这方面的更多信息,您可以查看此Oracle Doc

我们可以通过添加具有实际Oracle Type name的第三个参数来修复异常"java.sql.SQLException: ORA-03115: unsupported network datatype or representation“。在您的示例中,它是NAMESARRAY

代码语言:javascript
复制
cstmt.registerOutParameter(1, OracleTypes.ARRAY,"NAMESARRAY");

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

java.sql.SQLException:无效的名称模式: SCOTT.NAMESARRAY

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

在DB:中创建类型的

代码语言:javascript
复制
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:忽略语句

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

代码语言:javascript
复制
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;";

因此,我们需要删除其中的类型声明。

代码语言:javascript
复制
String dequeueQuery = "DECLARE " +
            " names namesarray;" +
            "   total integer;" +
            "   BEGIN " +
            "   names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); " +
            "   ? := names;"+
            " END;";

在删除它之后,如果我们在编译后执行该程序,我们应该能够看到以下输出:

代码语言:javascript
复制
Kavita
Pritam
Ayan
Rishav
Aziz

以下是更新后的程序:

代码语言:javascript
复制
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();}
    }
}
票数 8
EN

Stack Overflow用户

发布于 2015-10-05 14:52:25

我认为您使用的是ojdbc14.jar

尝试使用一次,它应该可以工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28579184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档