Запрос к базе данных Oracle из Revolution R с использованием RODBC - PullRequest
6 голосов
/ 04 августа 2010

Ошибка RODBC в 64-разрядной версии Revolution R на бите winxp64, подключенном к Oracle с использованием 64-разрядного драйвера ODBC через 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

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

Спасибо, Арун

Ответы [ 4 ]

18 голосов
/ 10 августа 2010

believeNRows = ЛОЖЬ, кажется, ключ.Лучше всего использовать его при открытии соединения:

db <- odbcConnect (dsn = "testdsn", uid = "testuser", pwd = "testpasswd", believeNRows = FALSE) </p>

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

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

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

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

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

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

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

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

LANG = en_US;NLS_LANG = American_America

1 голос
/ 04 августа 2010

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

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

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

1 голос
/ 10 августа 2010

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

1 голос
/ 04 августа 2010

Ошибка

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

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

...