首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dbplyr Oracle别名限制数据库

dbplyr Oracle别名限制数据库
EN

Stack Overflow用户
提问于 2020-01-11 00:24:01
回答 1查看 242关注 0票数 1

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

示例误差

代码语言:javascript
复制
 test <- tbl(con, "long_shcema_name.very_long_and_descriptive_name") %>%
   select(a_column)
代码语言:javascript
复制
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)'

我以为这和司机有关。我的工作使用了Oracle12.2,它为标识符设置了更大的上限,但是dbGetQuery在实例化客户机上工作得很好

没有dbplyr的工作示例

代码语言:javascript
复制
dbGetQuery(con,'
  select "a_column"
  from 
  long_shcema_name.very_long_and_descriptive_name')
代码语言:javascript
复制
a_column
    1
    0
    2
    .
    .
    .

这给了我想要的结果。

有解决办法吗?

我有点烦。我用了将近三个星期的时间使用即时客户端建立了与我的works数据库的odbc连接。我能够从get开始使用RODBC和ROracle进行查询,但我想使用dplyr。结果失败了,我没有足够的精力去弄清楚原因了。在这一点上,任何帮助都将是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-11 04:35:49

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

查看生成错误消息的SQL:

代码语言:javascript
复制
SELECT *
FROM ("long_schema_name.very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)

这很可能被解释为:

{default}

  • schema ={}
  • table= long_schema_name.very_long_and_descriptive_name

而不是作为:

{default}

  • schema = long_schema_name

  • table = very_long_and_descriptive_name

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

代码语言:javascript
复制
 test <- tbl(con, in_schema("long_schema_name","very_long_and_descriptive_name") %>%
   select(a_column)

然后show_query(test)应该返回:

代码语言:javascript
复制
SELECT *
FROM ("long_schema_name"."very_long_and_descriptive_name") "zzz7"
WHERE (0 = 1)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59690605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档