【发布时间】: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的问题,而不是您的VARRAY:ORA-12899: value too large for column "ER706221"."TESTCASEIDDETAILS"."METHODREPLACEMENT" (actual: 10, maximum: 2) -
你能检查一下你为列名提供的内容吗:MethodReplacement 是 'y' 还是 'n',我的意思是你提供了比单个 char 值更多的值,这就是为什么它的值太大了。
-
sry 已经解决了还有一个问题