如何从 R 调用存储在 Oracle 数据库中的 PL/SQL 过程

Posted

技术标签:

【中文标题】如何从 R 调用存储在 Oracle 数据库中的 PL/SQL 过程【英文标题】:How to invoke a PL/SQL procedure stored on an Oracle database from R 【发布时间】:2014-01-27 23:28:07 【问题描述】:

我在 Windows 7 下运行以下版本的 R。

R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

使用库(RODBC),

channel <- odbcConnect(dsn = "database")

ProcExec <- "execute LENGTHCOMP(2004)"  
# the procedure returns nothing, but creates a series of Oracle tables needed later in the R function
sqlQuery(channel = channel, query = ProcExec, believeNRows = FALSE)

odbcClose(channel)

返回错误:

[1] "42000 0 [Oracle][ODBC]Syntax error or access violation."               
[2] "[RODBC] ERROR: Could not SQLExecDirect 'execute LENGTHCOMP(2004)'"   .

图书馆 ROracle(2013 年 8 月)表示

dbCallProc 方法 调用 SQL 存储过程 描述 尚未实施。

他们的其他 R 包是否提供在 Oracle 上调用存储的 PL/SQL 过程的功能?或者有没有办法让 sqlQuery 从 RODBC 包中做到这一点?

【问题讨论】:

我也有同样的问题。有没有人找到答案或解决方法? 【参考方案1】:

使用 ROracle,我成功地创建了一个 PLSQL 函数来包装过程调用:

create or replace function Wrapper_func (Sql_in in varchar2)
  return number
  authid current_user
as
  pragma autonomous_transaction;
begin
  execute immediate Sql_in;
  return 0;
exception
  when others then
    return sqlcode;
end Wrapper_func;

这是我从 R 中调用的:

sqldata<-dbGetQuery(con, "select wrapper_func ('begin proc_t(137); end;') from dual")

如果过程调用成功,该函数返回 0,如果过程调用失败,则返回错误代码。该过程需要以 current_user 身份运行,因为它将执行给它的任何 sql。

正确的方法可能是使用与过程调用签名匹配的特定函数调用来包装所有过程调用。这些函数不必是 current_user,因为它们只传递参数。

【讨论】:

【参考方案2】:

我尝试了上述方法从 R 调用过程,但您无法从函数运行涉及 DML 和 DDL 操作的过程。

我找到了另一种不使用包装函数将过程作为 sql 语句执行的方法。

stmt

dbSendQuery(con,stmt,df) 或 oracleProc(con,stmt,df)

我在这里使用了 ROracle 库。

df 是包含要在过程 proc 中传递的参数的数据框。

希望对你有帮助!!

【讨论】:

以上是关于如何从 R 调用存储在 Oracle 数据库中的 PL/SQL 过程的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 Oracle 存储过程?

怎样在sql语句中oracle调用存储过程

delphi 三层架构如何调用oracle 存储过程,应该使用哪个部件,最好有实例

在oracle中 存储过程如何调用存储过程?

如何在ORACLE存储过程中调用WEBSERVICE函数

Oracle:如何使用 if 条件在存储过程中调用存储过程