【问题标题】:dbplyr Oracle alias limit databasedbplyr Oracle 别名限制数据库
【发布时间】:2020-04-28 15:08:13
【问题描述】:

经过漫长的故障排除过程,我终于让 RStudio 使用即时客户端连接到我的工作 Oracle 数据库。这样做的动机是使用 dbplyr 来完成我的大部分查询。但是,我无法通过 dbplyr 发送任何查询,因为所有列名和表名都很长,导致 ORA-00972: identifier is too long.

示例错误

 test <- tbl(con, "long_shcema_name.very_long_and_descriptive_name") %>%
   select(a_column)
Error: nanodbc/nanodbc.cpp:1617: 42000: [Oracle][ODBC][Ora]ORA-00972: identifier is too long

<SQL> 'SELECT *
FROM ("long_shcema_name.very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)'

我认为问题与驱动程序有关。我的工作使用 Oracle 12.2,它对标识符有更大的上限,但 dbGetQuery 在 Instantclient 上运行良好

没有 dbplyr 的工作示例

dbGetQuery(con,'
  select "a_column"
  from 
  long_shcema_name.very_long_and_descriptive_name')
a_column
    1
    0
    2
    .
    .
    .

这给了我想要的结果。

是否存在解决方案?

我有点生气。我花了将近三周的时间才使用即时客户端与我的作品数据库建立了 odbc 连接。我能够从一开始就使用 RODBC 和 ROracle 进行查询,但我想使用 dplyr。它最终不起作用,我没有太多的果汁来找出原因。在这一点上,任何帮助将不胜感激。

【问题讨论】:

  • 我是否正确理解第二种解决方案对您有效,但您不能为此使用 dbplyr?你能通过管道get_query() 来检索 SQL 代码吗?
  • 我以前遇到过这种情况,有时(并非总是)使用in_schema 函数有效。我想对你来说它会像tbl(con, in_schema("long_shcema_name”, “very_long_and_descriptive_name"))
  • in_schema 函数正在工作。你知道什么时候它不起作用吗?我通常会尝试在连接字符串中指定模式,所以我想知道是否可以在 odbc 和 dbplyr 之间引入更多兼容性。

标签: r oracle dplyr odbc dbplyr


【解决方案1】:

问题很可能不是长文件名(除非您的表名超过 30 个字符,请参阅here),而是使用了模式。 Oracle 可以使用双引号来标识数据库、模式和表名 (ref)。方括号有时也用于此目的 (ref)。

查看产生错误消息的 SQL:

SELECT *
FROM ("long_schema_name.very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)

这很可能被解释为:

  • 数据库 = {默认}
  • 架构 = {空}
  • 表 = long_schema_name.very_long_and_descriptive_name

而不是:

  • 数据库 = {默认}
  • schema = long_schema_name
  • table = very_long_and_descriptive_name

作为@Wil cmets,您可以使用in_schema 函数解决这个问题。如果你尝试:

 test <- tbl(con, in_schema("long_schema_name","very_long_and_descriptive_name") %>%
   select(a_column)

那么show_query(test) 应该返回:

SELECT *
FROM ("long_schema_name"."very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)

请注意这与第一个查询的不同之处在于在句号的两侧添加了双引号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多