Запросы Oracle DB от Оборота R использующий RODBC

Ошибка RODBC в Обороте R 64 бита в winxp64 укусила подключенный к Oracle с помощью драйвера ODBC на 64 бита через DSN

library(RODBC)
db <- odbcConnect("oraclemiso",uid="epicedf",pwd="…")
rslts = sqlQuery(db, "select count(*) from FTRAuction")

Error in .Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize,  : 
  negative length vectors are not allowed

Я могу соединиться, но получить ошибку, когда я запрашиваю для материала, также ниже работ

 library(RODBC)
 channel <- odbcConnect("OraLSH", <user>, <password>))
 odbcQuery (channel, "select sysdate from dual")
 sqlGetResults(channel, as.is=FALSE, errors=FALSE, max=1, buffsize=1,
nullstring=NA, na.strings="NA", believeNRows=TRUE, dec=getOption("dec"))
              SYSDATE
1 2010-01-24 15:10:02

но что, если я не знаю rowsize (max=1) перед рукой

Спасибо, Arun

6
задан Dirk Eddelbuettel 4 August 2010 в 15:24
поделиться

4 ответа

thinkNRows = FALSE кажется ключевым. Лучше всего использовать его при открытии соединения:

db <- odbcConnect (dsn = "testdsn", uid = "testuser", pwd = "testpasswd", trustNRows = FALSE)

При тестировании с isql unixODBC он сообщает SQLRowCount должен быть 4294967295 (даже если есть только одна строка) в 64-битном Linux, в то время как он сообщает -1 в 32-битном Linux. Вероятно, это оптимизация, поскольку она позволяет быстрее получать ответы. Это избавляет базу данных от бремени немедленного получения полного набора данных ответа. Например. может быть много записей, в то время как будут получены только первые несколько совпадений.

4294967295 равно (2 ^ 32) -1, что является максимальным значением для целого числа без знака, но будет интерпретироваться как -1 с целым числом со знаком. Таким образом, R жалуется на вектор с отрицательной длиной. Поэтому я предполагаю, что это проблема подписанного или беззнакового целого числа (или sizeof (long) между 32 и 64 битами).

Установка BelieveNRows = FALSE решила проблему для меня, поэтому я могу использовать один и тот же код R в обеих системах.

Кстати: я использую R 2.10.1, RODBC 1.3.2, unixODBC 2.3.0 с Oracle 10.2.0.4 на 64-разрядной версии Linux. Обязательно используйте

export CFLAGS = "- DBUILD_REAL_64_BIT_MODE -DSIZEOF_LONG = 8 -fshort-wchar"

при настройке для unixODBC, поскольку драйвер Oracle ODBC ожидает REAL_64_BIT_MODE, а не LEGACY_64_BIT_MODE.

И помните о проблемах интернационализации: R использует $ LANG, а Oracle использует $ NLS_LANG.

У меня возникли проблемы с UTF8, поэтому я использую, например,

LANG = en_US; NLS_LANG = American_America

19
ответ дан 8 December 2019 в 05:52
поделиться

Ошибка

Error in .Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize,  : 
  negative length vectors are not allowed

очень похожа на проблему переноса 32- / 64-разрядной версии, поэтому я любезно предлагаю вам связаться с двумя участвующими коммерческими поставщиками, чтобы исправить ее. Я предпочитаю прямой драйвер базы данных, если он доступен через ODBC, но нет причин, по которым он не должен работать, поскольку 64-битный Linux весело играет.

1
ответ дан 8 December 2019 в 05:52
поделиться

Дирк прав - RODBC не поддерживает 64-битные драйверы для Oracle, по крайней мере, несколько месяцев назад. Возможно, вам не повезло. У нас была аналогичная проблема при попытке получить R для доступа к базе данных Oracle из 64-битного Linux-сервера с использованием следующих инструментов: 64-битный R, RODBC, unixODBC, Oracle Instant Client. Я спросил об этом список R-sig-db, включая автора пакета (профессора Рипли), и не получил окончательного ответа. Затем я спросил Revolution, готовы ли они решить эту проблему, если мы будем покупать у них лицензии (с пятизначной ставкой в ​​год!), И они сказали нет.

Моя компания сейчас пытается свести к минимуму использование R в тех областях, где это лучше всего подходит. Мы будем использовать другие инструменты (веб-службы, системы на основе JVM) для доступа к базе данных и обмениваться данными с R только при необходимости.

Основная проблема заключается в том, что очень немногие крупные пользователи R также используют Oracle. R в основном используется учеными (Excel, MySQL), специалистами в области финансов (Postgres) и более передовыми аналитическими командами. Oracle используется старыми предприятиями, которые ценят надежность выше инноваций, а это полная противоположность тому, что ищут большинство пользователей R. Таким образом, на мой взгляд, это объясняет, почему поддержка Oracle прекратилась.

1
ответ дан 8 December 2019 в 05:52
поделиться

Попробуйте max=0 и believeNRows=FALSE - у меня сработало.

1
ответ дан 8 December 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: