ROracle:dbGetQuery有效,但dbListTables和其他函数没有

时间:2016-09-07 16:13:16

标签: r oracle r-dbi roracle

我安装了ROracle(在directions in the package之后)并成功连接到我们的Oracle数据库。

我可以使用dbGetQuery运行查询,并获得结果,例如:

> dbGetQuery(con, "select count(*) from table_name")
  COUNT(*)
1     6111

但是,其他一些DBI / ROracle辅助函数没有结果:

> dbListTables(con)
character(0)

> dbReadTable(con, "table_name")
Error in .oci.GetQuery(con, qry) : 
  ORA-00942: table or view does not exist

任何想法可能是什么原因?

2 个答案:

答案 0 :(得分:1)

在这两种情况下,如果我指定schema参数,它们对我有用,即

dbListTables(con, schema = "my_schema")
dbReadTable(con,"table_name",schema = "my_schema")

此外,从阅读?dbListTables开始,它有allfull个参数来控制是否查看所有模式,以及是返回完整模式名称还是只返回表格名。

答案 1 :(得分:0)

在花费太多时间试图解决这个问题的底部后,我想记录后代的答案。实际上在dbReadTable中没有必要使用模式,但是将表名放在大写中是。也就是说,呼叫应该是

dbReadQuery(con, "TABLE_NAME")

为什么呢?

要了解dbReadTabledbGetQuery之间select * from table的不同之处,我会寻找来源:

> showMethods("dbReadTable")
Function: dbReadTable (package DBI)
conn="OraConnection", name="character"

所以它是一种S4方法。我们将getMethod与上述签名一起使用:

> getMethod("dbReadTable", signature = c(conn = "OraConnection", name = "character"))
Method Definition:

function (conn, name, ...) 
{
    .local <- function (conn, name, schema = NULL, row.names = NULL, 
        ...) 
    .oci.ReadTable(conn, name, schema = schema, row.names = row.names)
    .local(conn, name, ...)
}
<environment: namespace:ROracle>
可以在ROracle的源代码中找到{p> .oci.ReadTable here。它所做的只是检查参数有效性,调用dbGetQuery,并设置行名称。相关部分(调用dbGetQuery)在这里:

# form name
if (is.null(schema))
  tab <- sprintf('"%s"', name)
else
  tab <- sprintf('"%s"."%s"', schema, name)

# read table
qry <- paste('select *',
               'from', tab)
res <- .oci.GetQuery(con, qry)

请注意,如果未指定架构,则使用表名而不使用&#34;架构。&#34;字首。但是,sprintf会为表名生成带引号的字符串,quoted table names are case sensitive! (dbGetQuery只传递一个不带引号的表名,该名称可以是小写的。)

这就是dbGetQuery(con, "select count(*) from table_name")工作的原因,dbReadQuery(con, "TABLE_NAME")也是如此,dbReadQuery(con, "table_name")没有。