使用ROracle在R中执行存储的Oracle过程

7
我在使用ROracle的过程中遇到了一些问题,具体是在执行/调用Oracle存储过程时。我已经尝试了很多不同的方法来调用存储过程,但是一直出现相同的错误。虽然我没有问题执行SELECT查询,但调用存储过程却很困难。我既使用了oracleProc函数,也使用了dbSendQuery函数,但都无济于事。ROracle文档中对于调用存储过程的示例非常缺乏,这让我感到失望。
举个例子,假设Oracle存储过程名为MYPROC,所在模式为MYSCHEMA。该存储过程非常简单,没有参数(它涉及读取几个表并将数据写入一个表中)。
当我在Oracle Developer中直接执行该存储过程时,没有任何问题:
以下代码在Oracle Developer中可行(但在R中不可行):
 EXEC MYSCHEMA.MYPROC;

我尝试通过ROracle从R中调用相同的过程,但出现错误。我尝试了多种不同的调用方法,但都遇到了相同的错误:

 # This didn't work in R
 > require(ROracle)
 > LOAD_query <- oracleProc(con1, "BEGIN EXEC MYSCHEMA.MYPROC; END;")

这是我得到的错误信息:

.oci.oracleProc(conn, statement, data = data, prefetch = prefetch, : 出现了错误。

# Then i tried the following and it still didn't work
> LOAD_query <- oracleProc(con1, "EXEC MYSCHEMA.MYPROC;")

这是我得到的错误信息(与上面的略有不同):

在执行.oci.oracleProc(conn, statement, data=data, prefetch=prefetch) 时出错:ORA-00900: SQL语句无效

# so then i tried dbSendQuery which works perfectly fine with any SELECT statements but it didn't work
> LOAD_query <- dbSendQuery(con1, "BEGIN EXEC MYSCHEMA.MYPROC; END;")

这是我得到的错误信息(与第一个相同):
``` Error in .oci.SendQuery(conn, statement, data = data, prefetch = prefetch, : ```
# I even tried the following to exhaust all possibilities. And still no luck. I get the same error as above:
> LOAD_query <- oracleProc(con1, "BEGIN EXEC MYSCHEMA.MYPROC(); END;")

我的存储过程没有任何参数。正如我提到的,当在Oracle开发者中调用时,它可以正常工作。 但是,我已经无法想出如何在R中使这个非常简单的查询工作了!然而,我只有通过ROracle来让它正常工作才有兴趣。


1
我不熟悉ROracle,但我可以告诉你EXECUTE是一个SQL*Plus命令。它既不在SQL调用中有效,也不在PL/SQL调用中有效。尝试使用LOAD_query <- oracleProc(con1, "MYSCHEMA.MYPROC")。我猜你也不需要分号,但也许你需要。 - APC
谢谢@APC,非常有帮助!虽然您的建议“MYSCHEMA.MYPROC”没有起作用,但我尝试了不同版本的运行它而没有使用EXEC,并找到了解决方案:“BEGIN MYSCHEMA,MYPROC; END;” Woohoo。PS-您需要在过程调用结尾处加上;,这与sendQuery不同,后者不应该在结尾处加上;。如此不一致!>;-{ PSS-在PLSQL中执行过程,EXEC或EXECUTE都可以工作。 - Ankhnesmerira
1个回答

4
您是否先创建(编译)了此存储过程呢?例如:
dbGetQuery(con, "CREATE PROCEDURE MYPROC ... ")

然后尝试像这样执行该过程:
oracleProc(con, "BEGIN MYPROC(); END;")

您说得没错,ROracle::oracleProc 的文档确实不好。以下示例对我很有帮助: https://community.oracle.com/thread/4058424


我绝对不需要使用dbGetQuery。该过程已经创建,而且我没有权限在特定模式上创建过程。但是您的建议是格式化查询并删除EXEC:
LOAD_query <- oracleProc(con1, "BEGIN MYSCHEMA.MYPROC; END;")
- Ankhnesmerira

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接