2

随着 的发布dplyr 0.7.0,现在据说可以很容易地使用该odbc软件包连接到 Oracle。但是,我在访问不在默认模式内的表时遇到了问题(对我来说,这是我的用户名)。例如,假设TEST_TABLEschema 中有表TEST_SCHEMA。然后,获取数据的示例 SQL 语法将是:select * from TEST_SCHEMA.TEST_TABLE'.

为了在`dplyr中做同样的事情,我正在尝试以下操作:

# make database connection using odbc: [here's a guide][1]
oracle_con <- DBI::dbConnect(odbc::odbc(), "DB")
# attempt to get table data
tbl(oracle_con, 'TEST_SCHEMA.TEST_TABLE')

现在,这会导致错误消息:

Error: <SQL> 'SELECT *
FROM ("TEST_SCHEMA.TEST_TABLE") "zzz12"
WHERE (0 = 1)'
  nanodbc/nanodbc.cpp:1587: 42S02: [Oracle][ODBC][Ora]ORA-00942: table or view does not exist

我认为这里的问题是双引号,如:

DBI::dbGetQuery(oracle_con, "select * from (TEST_SCHEMA.TEST_TABLE) where rownum < 100;")

工作正常。

4

1 回答 1

2

我为此苦苦挣扎了一段时间,直到dbplyr. 指定架构和表组合的正确语法是:

tbl(oracle_con, in_schema('TEST_SCHEMA', 'TEST_TABLE'))

顺便说一句,我认为引号的问题在这里提出:https ://github.com/tidyverse/dplyr/issues/3080

还有以下替代解决方法可能适合您,具体取决于您希望执行的操作。由于使用了连接DBI,因此可以通过以下方式更改架构:

DBI::dbSendQuery(oracle_con, "alter session set current_schema = TEST_SCHEMA")

之后tbl(oracle_con, 'TEST_TABLE')就可以了。

或者,如果您具有创建视图权限,则可以在默认模式中为您感兴趣的任何表创建“快捷方式”:

DBI::dbSendQuery(oracle_con, "CREATE VIEW TEST_TABLE AS SELECT *
                 FROM TEST_SCHEMA.TEST_TABLE")

请注意,后者可能更适合您希望将本地数据复制到数据库以进行连接但对表的原始模式没有写入权限的应用程序。

于 2017-09-14T03:44:37.020 回答