Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s准备好的语句,带有oracle merge/upsert-索引处缺少IN或OUT参数_Java_Oracle_Prepared Statement_Upsert - Fatal编程技术网

Java';s准备好的语句,带有oracle merge/upsert-索引处缺少IN或OUT参数

Java';s准备好的语句,带有oracle merge/upsert-索引处缺少IN或OUT参数,java,oracle,prepared-statement,upsert,Java,Oracle,Prepared Statement,Upsert,我正在尝试对单个表执行合并(如果不存在,则插入else更新) 我准备好的声明如下: merge into table USING DUAL ON (primarykey=?) when not matched then insert (colum1,colum2,columnprimarykey,column4,column5,column6,column7,column8,column9,column10,column11,column12) VALUES (?,?,?,?,?,?,?,?,

我正在尝试对单个表执行合并(如果不存在,则插入else更新)

我准备好的声明如下:

merge into table USING DUAL ON (primarykey=?) 
when not matched then insert (colum1,colum2,columnprimarykey,column4,column5,column6,column7,column8,column9,column10,column11,column12) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) 
when matched then update set column1=?,column2=?,column4=?,column5=?,column6=?,column7=?,column8=?,column9=?,column10=?,column11=?,column12=?
但是当执行准备好的语句时,我得到以下错误:

merge into table USING DUAL ON (primarykey=?) 
when not matched then insert (colum1,colum2,columnprimarykey,column4,column5,column6,column7,column8,column9,column10,column11,column12) VALUES (?,?,?,?,?,?,?,?,?,?,?,?) 
when matched then update set column1=?,column2=?,column4=?,column5=?,column6=?,column7=?,column8=?,column9=?,column10=?,column11=?,column12=?
原因:java.sql.SQLException:索引::13处缺少IN或OUT参数 在oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(OraclePreparedStatement.java:1937)~[ojdbc8-19.3.0.0.jar!/:19.3.0.0]

当直接在SQLDeveloper中执行以下命令时,效果良好,如果在表中找不到primarykeycolumn=99,则将插入一条包含12列的新记录。如果在表中找到primarykeycolumn=99,它将更新其余11列

merge into table USING DUAL ON (primarykey=99) 
when not matched then insert 
(colum1,colum2,column3/primarykey,column4,column5,column6,column7,column8,column9,column10,column11,column12) VALUES (somevalue,somevalue,99,somevalue,somevalue,somevalue,somevalue,somevalue,somevalue,somevalue,somevalue,somevalue) 
when matched then update set 
column1=somevalue,column2=somevalue,column4=somevalue,column5=somevalue,column6=somevalue,column7=somevalue,column8=somevalue,column9=somevalue,column10=somevalue,column11=somevalue,column12=somevalue
Java代码:

public Mono<String> createData(final Mono<Record> inputMono) {
    final String someID = UUID.randomUUID().toString();

    final Mono<Integer> asyncUpdate = inputMono.flatMap(record -> {
        return beginUpdate(dataSource, 
  sqlStatementSharedAbove).withStatementEnricher(stmt -> {
            stmt.setString(1, record.getFirstName());
            stmt.setString(2, record.getLastName());
            stmt.setInt(3, record.getUserId());
            stmt.setString(4, record.getCOMPANYNAME());
            stmt.setInt(5, record.getCOMPANYID());
            stmt.setString(6, record.getEMAILID());
            stmt.setTimestamp(7,Timestamp.valueOf(now));
            stmt.setTimestamp(8,Timestamp.valueOf(now));
            stmt.setString(9,record.getDEPARTMENTNAME());
            stmt.setInt(10, record.getActiveInd());
            stmt.setInt(11, record.getTypeCode());
            stmt.setString(12, record..getTypeName());
        }).build();

    });
    return asyncUpdate.doOnSuccess(affectedRows -> LOGGER.debug("Added 
 {} rows with ID {}", affectedRows, someID))
        .map(affectedRows -> someID);
}
公共Mono createData(最终Mono输入Mono){
最后一个字符串someID=UUID.randomUUID().toString();
最终Mono asyncUpdate=inputMono.flatMap(记录->{
返回beginUpdate(数据源,
SqlStatementSharedBove).withStatementEnricher(stmt->{
stmt.setString(1,record.getFirstName());
stmt.setString(2,record.getLastName());
setInt(3,record.getUserId());
stmt.setString(4,record.getCOMPANYNAME());
stmt.setInt(5,record.getCOMPANYID());
stmt.setString(6,record.getEMAILID());
stmt.setTimestamp(7,Timestamp.valueOf(现在));
stmt.setTimestamp(8,Timestamp.valueOf(现在));
stmt.setString(9,record.getDEPARTMENTNAME());
setInt(10,record.getActiveInd());
setInt(11,record.getTypeCode());
stmt.setString(12,record..getTypeName());
}).build();
});
返回asyncUpdate.doOnSuccess(affectedRows->LOGGER.debug(“添加
{}个ID为{}的行,affectedRows,someID))
.map(affectedRows->someID);
}

更新部件只能使用表(查询)从使用部件返回的列值

因此,您需要将您的声明改写为以下内容:

merge into the_table USING 
(
  select ? as primarykey, 
         ? as column1, 
         ? as column2, 
         ? as column3,
         ....
  from dual
) x ON (x.primarykey = the_table.primarykey) 
when not matched then 
  insert (column1,column2,primarykey,column3, ...) 
  VALUES (x.column1, x.column2, x.primarykey, x.column3, ...) 
when matched then update 
  set column1 = x.column1,
      column2 = x.column2,
      ....

问题出在java代码中,您应该在文章中添加更多的代码。但是看看你的setter,BIND\u COLUMN3/PRIMARYKEY是什么意思?你应该通知索引,你为什么要计算应该使用的索引?@qxlab-我已经更新了上面的代码以使其更有意义。谢谢就这样!谢谢一匹没有名字的马。不过,我没有足够的声誉来推翻这个答案。