1

我想通过带有绑定参数的 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 )))

但我得到错误:

“绑定数据与绑定规范不匹配”

4

1 回答 1

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函数调用最终是一个字符串。相反,只绑定日期字符串。

于 2017-10-30T11:28:07.437 回答