Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
ROracle dbGetQuery/dbSendQuery如何处理多个绑定参数_R_Oracle_Roracle - Fatal编程技术网

ROracle dbGetQuery/dbSendQuery如何处理多个绑定参数

ROracle dbGetQuery/dbSendQuery如何处理多个绑定参数,r,oracle,roracle,R,Oracle,Roracle,在ROracle包中,dbSendQuery被定义为“dbSendQuery”(conn,statement,data=Null…),数据参数被指定为“指定绑定数据的data.frame” 我的问题在于函数如何读取数据参数 例如,我能够运行以下简化功能: statement = “SELECT * FROM DATA WHERE DATE BETWEEN :START AND :END” bind = data.frame(START = DT1, END = DT2) DT1 = ‘01-

在ROracle包中,dbSendQuery被定义为“dbSendQuery”(conn,statement,data=Null…),数据参数被指定为“指定绑定数据的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"
但是,如果使用以下语句和bind运行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)) 

没有成功。

在与ROracle所有者讨论之后,对于SQL语句中每次使用bind变量,似乎需要在bind数据框中输入一个条目。即使使用命名绑定也是如此:

bvn = as.numeric(1)
attr(bvn, "ora.parameter_name") <- "bv";
df <- data.frame(bvn, bvn)
dbGetQuery(con, "select * from dual where 1 = :bv and 1 = :bv", df)
bvn=as.numeric(1)

attr(bvn,“ora.parameter_name”)提示:编辑问题并格式化代码。使用其他人可以运行的示例,例如,从双通道选择。说出你的错误。通常,给出ROracle、Oracle客户端库和Oracle DB的版本。