编辑由于新信息而更改问题
我在Java程序中使用Groovy SQL库,并且在使用executeInsert()函数在Oracle数据库中插入行时遇到问题。
这是我的Java程序的一个片段:
DataSet myds = registry.lookupByNameAndType("myDataSet", DataSet.class);
// Use a stored function to add a row to the database and provide a keyword reference
int[] updateCounts = myds.withBatch(100, new Closure<Object>(this) {
public Object doCall(DataSet ds) {
Integer dupCount = 0;
String sqlString =
"INSERT INTO MY_TABLE " +
"(A_NUMBER_COLUMN) " +
"VALUES " +
"(':input_number')"; // one of the record Map elements
List<Object> params = new ArrayList<Object>();
List<String> keyColumnNames = new ArrayList<String>();
keyColumnNames.add("MY_ID_COLUMN");
for (Map<String, Object>record : incoming) {
try {
List<GroovyRowResult> keys = ds.executeInsert(record, sqlString, keyColumnNames);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
dupCount++;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return dupCount;
};
});
但是,当程序执行时,我收到一条SQL错误:
执行失败:INSERT INTO MY_TABLE(A_NUMBER_COLUMN)VALUES(&#39;:input_number&#39;)因为:列索引无效
我甚至试过更换命名参数&#34;:input_number&#34;带有问号和常数,并且每个都有相同的无效列索引错误。在Java程序中使用时,看起来Groovy函数中的参数替换完全被破坏。
谁能告诉我这应该是怎么回事? (并且,不。我不能选择直接使用Groovy程序。)
使用groovy-all-2.4.11.jar和jdk.1.8.0_131
谢谢!
答案 0 :(得分:0)
如果您正在调用返回某些内容的函数,则必须提供绑定并指定类型:
DataSet myds = registry.lookupByNameAndType("myDataSet", DataSet.class);
// Use a stored function to add a row to the database and provide a keyword reference
int[] updateCounts = myds.withBatch(100, new Closure<Object>(this) {
@SuppressWarnings("unused")
public Object doCall(DataSet ds) {
Integer dupCount = 0;
String sqlString = "{? = call aStoredFunction ( ?, ?, ?, ?, ?, ?, ?, ?, ? )}";
List<Object> params = new ArrayList<Object>();
for (Map<String, Object>record : incoming) {
params.clear();
params.add(Sql.NUMERIC)
params.add(record.get("param1"));
params.add(record.get("param2"));
params.add(record.get("param3"));
params.add(record.get("param4"));
params.add(record.get("param5"));
params.add(record.get("param6"));
params.add(record.get("param7"));
params.add(record.get("param8"));
params.add(record.get("param9"));
try {
sql.call( sqlString, params ) { result -> dupCount = result }
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return dupCount;
};
});
答案 1 :(得分:0)
在戳了一会儿之后,我向Groovy用户邮件列表提交了一个问题。事实证明我发现了Groovy中的一个错误。 JIRA issue submitted