В пакете R Oracle dbSendQuery определяется как «dbSendQuery» (conn, Statement, data = Null ...), а аргумент data указывается как «data.frame, определяющий данные связывания».
Мой вопрос заключается в том, как аргумент данных читается функцией.
Например, я могу запустить следующую упрощенную функцию:
statement = “SELECT * FROM DATA WHERE DATE BETWEEN :START AND :END”
bind = data.frame(START = DT1, END = DT2)
DT1 = ‘01-jan-2020’
DT2 = ‘31-jan-2020’
dbSendQuery(con, statement = state, data = bind)
Однако я получаю сообщение об ошибке при попытке запустить функцию с оператором SQL, который несколько раз вызывает одни и те же параметры связывания.
Например, если я пытаюсь запустить приведенный выше код со следующим упрощенным оператором, код не работает:
statement =
WITH DATA1 AS (SELECT * FROM TABLE1 WHERE DATE BETWEEN :START AND :END),
DATA2 AS (SELECT * FROM TABLE2 WHERE DATE BETWEEN :START AND :END),
DATA3 AS (SELECT * FROM DATA2 LEFT JOIN DATA1 ON DATA2.COLUMN = DATA1.COLUMN)
SELECT *
FROM DATA3
UNION ALL
SELECT *
FROM DATA3 A
JOIN
(SELECT * FROM TABLE2
WHERE DATE BETWEEN :START AND :END) B
ON A.DATE = B.DATE"
Однако функция работает, если я запускаю dbSendQuery со следующим утверждением и связыванием:
statement =
"WITH DATA1 AS (SELECT * FROM TABLE1 WHERE DATE BETWEEN :START1 AND :END1),
DATA2 AS (SELECT * FROM TABLE2 WHERE DATE BETWEEN :START2 AND :END2),
DATA3 AS (SELECT * FROM DATA2 LEFT JOIN DATA1 ON DATA2.COLUMN = DATA1.COLUMN)
SELECT *
FROM DATA3
UNION ALL
SELECT *
FROM DATA3 A
JOIN
(SELECT * FROM TABLE2
WHERE DATE BETWEEN :START3 AND :END3) B
ON A.DATE = B.DATE"
bind = data.frame(START1, = DT1, START2 = DT1, START3 = DT1, END1 = DT2, END2 = DT2, END3 = DT2).
Хотя вышеуказанный метод работает, мне любопытно, почему я не могу запустить dbSendQuery с простым фреймом данных
bind = data.frame(START = DT1, END = DT2)
, когда В операторе многократно используются одни и те же параметры связывания.
Я также попытался запустить dbSendQuery с
bind = data.frame(START = rep(DT1,3), END = rep(DT2,3))
, но безуспешно.