Ошибка 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
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
Ошибка
Error in .Call(C_RODBCFetchRows, attr(channel, "handle_ptr"), max, buffsize, :
negative length vectors are not allowed
очень похожа на проблему переноса 32- / 64-разрядной версии, поэтому я любезно предлагаю вам связаться с двумя участвующими коммерческими поставщиками, чтобы исправить ее. Я предпочитаю прямой драйвер базы данных, если он доступен через ODBC, но нет причин, по которым он не должен работать, поскольку 64-битный Linux весело играет.
Дирк прав - 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 прекратилась.
Попробуйте max=0
и believeNRows=FALSE
- у меня сработало.