花了太多时间试图弄清这个问题的真相后,我想记录下答案以供后人参考。在dbReadTable 中实际上不需要架构,但是将表名以大写形式表示。也就是说,调用应该是
dbReadQuery(con, "TABLE_NAME")
为什么?
要了解 dbReadTable 与带有 select * from table 调用的 dbGetQuery 有何不同,我挖掘了源代码:
> 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>
.oci.ReadTable 可以在 ROracle 的源代码中找到 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)
请注意,如果未指定架构,则使用不带“架构”的表名。字首。但是,sprintf 为表名生成带引号的字符串,quoted table names are case sensitive! (dbGetQuery 只是传递一个可以是小写的不带引号的表名。)
这就是为什么 dbGetQuery(con, "select count(*) from table_name") 有效,dbReadQuery(con, "TABLE_NAME") 也有效,但 dbReadQuery(con, "table_name") 无效。