与 Oracle 数据库的 RODBC 连接不起作用,崩溃 R
Posted
技术标签:
【中文标题】与 Oracle 数据库的 RODBC 连接不起作用,崩溃 R【英文标题】:RODBC connection to Oracle database not working, crashes R 【发布时间】:2013-02-26 21:55:40 【问题描述】:我有许多脚本可以在 Windows XP 上通过 ODBC 从 Oracle 10g 数据库中提取数据,这些脚本已经运行了很长时间。我最近设置了一个新的 Oracle 帐户以从同一数据库的另一个模式中提取数据,但是当我使用该帐户和不同的模式进行测试时,我得到了奇怪的结果,并且有时可以(可靠地)完全杀死 R!
我使用 odbcConnect 连接到数据库,并且尝试过相信NRows 和 rows_at_time 没有区别
>imcon<-odbcConnect(sid, uid=uid, pwd=pwd, believeNRows = FALSE, rows_at_time=1)
> odbcGetInfo(imcon)
DBMS_Name DBMS_Ver Driver_ODBC_Ver Data_Source_Name Driver_Name Driver_Ver ODBC_Ver Server_Name
"Oracle" "10.02.0030" "03.51" "SID" "SQORA32.DLL" "09.02.0000" "03.52.0000" "SID"
然后我尝试一些查询(尽可能简单。这个返回零行(此表中有两行),并且大多数列名都替换为 A.n
> sqlQuery(imcon, "select * from SCHEMA.USERS;")
[1] PASSWORD USER_DISABLED USE_DOMAIN_AUTHENTICATION ID DESCRIPTION
[6] ADMIN_USER A A.1 A.2 A.3
[11] A.4 A.5 A.6 A.7 A.8
[16] A.9 A.10 A.11 A.12 A.13
[21] A.14 A.15 A.16 A.17 A.18
[26] A.19 A.20 A.21 A.22 A.23
[31] A.24 A.25 A.26 A.27 A.28
[36] A.29 A.30 A.31 A.32 A.33
<0 rows> (or 0-length row.names)
Warning messages:
1: In deparse(., width.cutoff = max(20, width - 10)) :
invalid 'cutoff' for deparse, using default
2: In deparse(., width.cutoff = max(20, width - 10)) :
invalid 'cutoff' for deparse, using default
这可行,但返回零行并且两个日期列被截断为 L 和 L.1
> sqlQuery(imcon, "select ID, DESCRIPTION, NAME, FIRST_NAME, LAST_NAME, DATE_CREATED, DATE_LAST_MODIFIED from SCHEMA.USERS;")
[1] ID DESCRIPTION NAME FIRST_NAME LAST_NAME L L.1
<0 rows> (or 0-length row.names)
这工作正常,并返回数据
> sqlQuery(imcon, "select ID, DESCRIPTION, NAME, FIRST_NAME, LAST_NAME, ADMIN_USER from SCHEMA.USERS;")
ID DESCRIPTION NAME FIRST_NAME LAST_NAME ADMIN_USER
1 1 <NA> SYSTEM <NA> NA TRUE
2 2 Admin user ADMIN Admin NA TRUE
这似乎杀死了 R(老实说)
> sqlQuery(imcon, "select ID, DESCRIPTION, NAME, FIRST_NAME, LAST_NAME, DATE_CREATED from SCHEMA.USERS;")
R 死了。 (在 StatEt 和 RGui 中)
所以我的问题;
a) 有谁知道出了什么问题?
b) 有谁知道我还可以采取哪些步骤来诊断?
【问题讨论】:
在 b) 部分,您可以手动运行sqlQuery
的源代码执行语句以查看每个阶段返回的内容或使用 debug(sqlQuery)
?该函数中调用的某些函数不会从RODBC
命名空间中导出,因此要查看它们的源代码,请使用getAnywhere
,例如getAnywhere(odbcValidChannel)
我猜是驱动有问题。您可以发布odbcGetInfo
的输出以用于工作连接吗?
@Joshua 两者的驱动是一样的,所以上面的getInfo是一样的。我在装有 Oracle 9.2(sqora32.dll,v9.02.00)的 Windows XP 机器上设置了系统 DSN。这就是让我感到困惑的地方,两个连接使用相同的驱动程序、相同的数据库但有两个不同的用户和两个目标模式,一个有效,一个无效。
那么是时候询问Oracle了。毫无疑问,您的公司向他们支付了巨额资金。是时候让他们赚钱了。再想一想,他们可能会责怪 R;在另一个应用程序(例如 SQuirreL)中运行这些查询是否有任何问题?
【参考方案1】:
经过一番尝试并试图简化我的问题后,我注意到 SQLPlus 的输出非常奇怪(列标题的下划线非常非常长)。这导致我查看 SQL Developer 中的数据,它向我展示了列类(我确信 SQLPlus 也可以这样做)。看起来大多数文本字段都是 varchar2(4000) 或类似的,日期字段是带有时区的日期戳。似乎 varchars 阻止了返回结果,并且日期戳完全杀死了 R。
例如,我修改了我的查询,通过对 varchar2 使用 substr 和对 datestamp 使用 to_char 将这些列恢复为正常值;
select substr(t1.STATUS_DETAIL,0,24) as DETAIL,
to_char(t1.DATE_CREATED,'YYYY-MM-DD HH24:MI:SS') AS DCREATED
from SCHEMA.TABLE;
阻止了 R 崩溃,并返回结果!我将通过电子邮件向 RODBC 的包维护人员发送电子邮件,并将此答案留给遇到此问题的任何其他人。
【讨论】:
以上是关于与 Oracle 数据库的 RODBC 连接不起作用,崩溃 R的主要内容,如果未能解决你的问题,请参考以下文章
R语言︱ 数据库SQL-R连接与SQL语句执行(RODBCsqldf包)
R语言︱ 数据库SQL-R连接与SQL语句执行(RODBCsqldf包)