在Java程序中使用groovy.sql.Sql.executeInsert()

时间:2017-04-27 19:46:29

标签: java oracle groovy

编辑由于新信息而更改问题

我在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

谢谢!

2 个答案:

答案 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