RODBC :: sqlQuery检测隐藏的字符

时间:2018-06-20 18:44:41

标签: r oracle rodbc

使用RODBC查询Oracle数据库时,我在隐藏字符方面苦苦挣扎。首先是我的代码:

library(RODBC)
con <- odbcConect('dsn', uid = 'user', pwd = 'pass')
query <- read_file('Query.sql')
query <- gsub('\n', ' ',gsub('\t', ' ',gsub('\r' ,' ', query)))

我在这里使用gsub手动删除我在sql文件中标识的三个隐藏字符。

df <- sqlQuery(con, query = query)

这将返回两个错误的列表。

[1] "HY000 911 [Oracle][ODBC][Ora]ORA-00911: invalid character\n" 

[2] "[RODBC] ERROR: Could not SQLExecDirect...

最初,我是从Outlook复制此查询并将其粘贴到文本文件中。然后我重新输入了整个内容,希望能消除隐藏的字符。现在,我使用一串gsubs手动删除隐藏的字符,但仍然收到错误。查看“查询”向量时,我看不到任何隐藏的字符,因此我不确定问题出在哪里。

我已经读到RODBC可以在SQL查询中进行聚合,但是此查询仅对更高级别的关键字使用LEFT JOIN,CASE和WHERE。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

也许可以使用base:iconv()将所有内容转换为ASCII。

如果查询本身包含错误字符,我将首先从一个简单的带有一列的SELECT查询开始;从一个新的文本文件开始,在该文件中您知道编码是正确的。确保查询可在Oracle Developer中运行(或不依赖R的查询)。然后确保RODBC连接可与该简单查询一起使用。

假设您必须使用不是从头开始编写的sql文件,那么您可能想朝这个方向努力。

content   <- readr::read_file("Query.sql")
cleaned   <- base::iconv(x=content, from="latin1", to="ASCII//TRANSLIT", sub="&")

if( grepl("&", cleaned) ) {
  cat(cleaned)
  stop("The query might contain non-ASCII characters with no good non-ASCII equivalent.  Check the console for the '&' substitution character.")
}

con <- odbcConect('dsn', uid = 'user', pwd = 'pass')
df  <- sqlQuery(con, query = returned_value)

在可能有坏字符的情况下,我抛出了一个错误,因为可能不清楚应该替换什么字符。

即使那不是您最终想要的解决方案,将所有内容折叠为ASCII也可以帮助您确认怀疑。另外,请考虑使用记事本++或Atom来显示非打印字符,例如https://stackoverflow.com/a/8523118/1082435