使用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。
感谢您的帮助。
答案 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。