我希望通过带有绑定参数的ROracle查询发送到oracle,这些参数包含日期列的日期范围。
我试着跑:
idsample <- 123
strdate <- "TO_DATE('01/02/2017','DD/MM/YYYY')"
enddate <- "TO_DATE('01/05/2017','DD/MM/YYYY')"
res <- dbGetQuery(myconn,"SELECT * FROM MYTABLE WHERE MYID = :1 AND MYDATE BETWEEN :2 AND :3", data=data.frame(MYID =idsample , MYDATE=c(strdate,enddate )))
但我收到错误:
&#34;绑定数据与绑定规范不匹配&#34;
答案 0 :(得分:1)
我找不到涵盖使用多个位置参数的文档,但如果一个参数对应于数据框的单个列,那么通过这个逻辑,三个参数应对应三列:
idsample <- 123
strdate <- "TO_DATE('01/02/2017', 'DD/MM/YYYY')"
enddate <- "TO_DATE('01/05/2017', 'DD/MM/YYYY')"
res <- dbGetQuery(myconn,
paste0("SELECT * FROM MYTABLE WHERE MYID = :1 AND ",
"MYDATE BETWEEN TO_DATE(:2, 'DD/MM/YYYY') AND TO_DATE(:3, 'DD/MM/YYYY')"),
data=data.frame(idsample, strdate, enddate))
请注意,从API的角度来看,strdate
和enddate
没有什么特别之处,因此它们应该作为向量传递。
修改强>
使TO_DATE
参数的问题在于它最终可能会被转义为字符串。换句话说,通过我的第一种方法,您最终会在WHERE
子句中得到以下内容:
WHERE MYDATE BETWEEN
'TO_DATE('01/02/2017','DD/MM/YYYY')' AND 'TO_DATE('01/05/2017','DD/MM/YYYY')'
换句话说,TO_DATE
函数调用最终成为一个字符串。而是仅绑定日期字符串。