【问题标题】:insert values into table using Varray使用 Varray 将值插入表中
【发布时间】:2015-10-30 08:06:36
【问题描述】:

这是我的代码,其中 METHODARGDATATYPE_VARRAY 是我表中第 5 列的可变数组,并且第一列具有自动生成的与 't' 连接的序列。

    List<String> str= new ArrayList<String>();
    str.add("argdataty1");
    str.add("argdataty2");

以上部分是用main方法编写的,我将在其中设置bean值

    testCaseIDandDetailsBean.setMethodArgDataType(str); 

并将其传递给执行添加到数据库的方法

    public String addTestCaseIDandDetails(TestCaseIDandDetailsBean testCaseIDandDetailsBean)

方法代码如下

     List<String> str= new ArrayList<String>();
     str=testCaseIDandDetailsBean.getMethodArgDataType();

    String arrayElements[] = new String[30];
      int i1=0;
     for(String itr : str){
        arrayElements[i1]=itr.toString();
        System.out.println(arrayElements[i1]);
        i1++;
     }
    String arrayElements[] = { "Test3", "Test4" };
    ArrayDescriptor desc = ArrayDescriptor.createDescriptor
                                    ("METHODARGDATATYPE_VARRAY", conn);
    ARRAY newArray = new ARRAY(desc, conn, arrayElements);

    String sql="insert into TestCaseIDDetails values (concat('t',TestCaseID_sequence.nextval),?,?,?,?)";
    PreparedStatement ps = conn.prepareStatement (sql);
    ps.setString(1,testCaseIDandDetailsBean.getClass_name()) ;
    ps.setString(2,testCaseIDandDetailsBean.getMethod_name()) ;
    ps.setString(3,testCaseIDandDetailsBean.getMethodReplacement()) ;
      ((OraclePreparedStatement)ps).setARRAY (4, newArray);

    ps.execute ();

我收到以下错误:

    java.sql.SQLException: Exceeded maximum VARRAY limit 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.oracore.OracleTypeCOLLECTION.pickle81(OracleTypeCOLLECTION.java:707)
at oracle.jdbc.oracore.OracleTypeADT.pickle81(OracleTypeADT.java:1980)
at oracle.jdbc.oracore.OracleTypeADT.linearize(OracleTypeADT.java:1364)
at oracle.sql.ArrayDescriptor.toBytes(ArrayDescriptor.java:697)
at oracle.sql.ARRAY.toBytes(ARRAY.java:680)
at oracle.jdbc.driver.OraclePreparedStatement.setArrayCritical(OraclePreparedStatement.java:5958)
at oracle.jdbc.driver.OraclePreparedStatement.setARRAYInternal(OraclePreparedStatement.java:5918)
at oracle.jdbc.driver.OraclePreparedStatement.setARRAY(OraclePreparedStatement.java:5898)
at implementation.TestCaseIDandDetailsDAOImpl.addTestCaseIDandDetails(TestCaseIDandDetailsDAOImpl.java:61)
at implementation.TestCaseIDandDetailsDAOImpl.main(TestCaseIDandDetailsDAOImpl.java:141)

我的数据库表是:

   CREATE or replace TYPE METHODARGDATATYPE_VARRAY AS VARRAY(20) OF varchar2(30);
   create table TestCaseIDDetails(
      testcaseID varchar2(20) primary key,
      classname varchar2(20) not null,
      methodname varchar2(20) not null,
      MethodReplacement char(2) check(MethodReplacement in ('y','n')),
      MethodArgDataType METHODARGDATATYPE_VARRAY);

 Create sequence TestCaseID_sequence minvalue 1 start with 1 increment by 1 ;

【问题讨论】:

  • 我曾尝试创建或替换 TYPE METHODARGDATATYPE_VARRAY AS VARRAY(20) OF varchar2(30 char);但不工作
  • 这似乎是您的MethodReplacement 的问题,而不是您的VARRAYORA-12899: value too large for column "ER706221"."TESTCASEIDDETAILS"."METHODREPLACEMENT" (actual: 10, maximum: 2)
  • 你能检查一下你为列名提供的内容吗:MethodReplacement 是 'y' 还是 'n',我的意思是你提供了比单个 char 值更多的值,这就是为什么它的值太大了。
  • sry 已经解决了还有一个问题

标签: java sql oracle jdbc


【解决方案1】:

您在第 4 列中输入的值太大。根据表定义,它最多接受 2 个字符,并且值必须是“y”或“n”。 (顺便说一句,这是一个奇怪的定义,因为 'y' 和 'n' 是单个字符,不需要 2)。问题是你给它10个字符!

这是因为 testCaseIDandDetailsBean.getMethodReplacement() 方法没有返回正确的值。

编辑:对于您编辑的问题(您应该发布另一个问题并将此答案标记为已接受,而不是编辑此答案,但无论如何我都会回答): 您插入的数组大于表定义的限制。该表定义了一个 VARRAY(20),所以问题是您试图插入一个包含 20 多个元素的数组。 2个解决方案:

  • 增加表定义中的限制
  • 制作一个更小的数组

【讨论】:

  • sry 已经解决了还有一个问题
  • 你能不能不要每次都换问题?
  • sry 从昨天早上开始就对这个 db 部分产生了兴趣,我对此感到非常恼火,所以我从现在开始几乎没有离开。
  • 非常感谢它帮助了我:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多