使用RJDBC按条件更新Oracle数据库值遇问题求助
解决RJDBC执行Oracle更新语句失败的问题
可能的原因及对应解决方法
1. 替换占位符格式
Oracle JDBC驱动通常使用**命名占位符(:n 格式)**而非(?),修改语句试试:
dbSendUpdate(db_iot, "UPDATE IOT_DATA SET IOTFILE = :1 WHERE VARIABLE = :2;", "1_prod_vorl_0.Rmd", 'wss')
或者用命名参数的方式更直观:
dbSendUpdate(db_iot, "UPDATE IOT_DATA SET IOTFILE = :iotfile WHERE VARIABLE = :var;", iotfile = "1_prod_vorl_0.Rmd", var = 'wss')
2. 手动提交事务
RJDBC默认可能开启事务但不会自动提交,执行更新后需手动提交:
# 执行更新语句 res <- dbSendUpdate(db_iot, "UPDATE IOT_DATA SET IOTFILE = :1 WHERE VARIABLE = :2;", "1_prod_vorl_0.Rmd", 'wss') # 提交事务 dbCommit(db_iot) # 释放结果集资源 dbClearResult(res)
3. 匹配参数与字段类型
如果数据库中IOTFILE是CLOB等特殊类型,需转换参数类型后再传入:
library(RJDBC) # 将字符串转为Oracle的CLOB类型 clob_val <- .jnew("oracle.sql.CLOB", .jcall(db_iot@jc, "Ljava/sql/Connection;", "getConnection"), "1_prod_vorl_0.Rmd") # 执行更新并提交 dbSendUpdate(db_iot, "UPDATE IOT_DATA SET IOTFILE = :1 WHERE VARIABLE = :2;", clob_val, 'wss') dbCommit(db_iot)
4. 开启调试日志排查
开启JDBC调试日志,查看实际发送到数据库的语句细节:
# 在创建数据库连接前设置日志级别 .jclassLoader()$addClassPath("path/to/ojdbc.jar") .jinit() .jcall("java.util.logging.Logger", , "getLogger", "oracle.jdbc")$setLevel(.jfield("java.util.logging.Level", , "FINE")) # 重新创建连接并执行更新,查看控制台输出的SQL详情
内容的提问来源于stack exchange,提问作者arnyeinstein
相关产品推荐
相关产品推荐

