我有许多脚本通过Windows XP上的ODBC从Oracle 10g数据库中提取数据,这些脚本已经运行了很长时间。我最近设置了一个新的Oracle帐户来从同一个数据库的另一个模式中提取数据,但是当我使用该帐户和不同模式进行测试时,我得到了奇怪的结果,并且可以(可靠地)有时完全杀死R!
我使用odbcConnect连接到数据库,并且尝试了believeNRows和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)有谁知道我可以采取哪些步骤进行诊断?
答案 0 :(得分:1)
经过一些游戏并试图简化我的问题后,我注意到SQLPlus的输出非常奇怪(列标题非常非常长)。这让我看看SQL Developer中的数据,它向我展示了列类(我确信SQLPlus也可以做到这一点)。看起来大多数文本字段是varchar2(4000)或类似,日期字段是带有时区的日期戳。似乎varchars会停止返回结果,而datestamps会完全杀死R.
我修改了我的查询,通过使用subschar作为varchar2来剥离这些列,然后使用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的软件包维护者,并将此答案留给有此问题的其他人。