Запрос Oracle DB от Revolution R Использование RODBC

StackOverflow https://stackoverflow.com/questions/3407015

  •  25-09-2019
  •  | 
  •  

Вопрос

RODBC Ошибка в Revolution R 64bit на BIT 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

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

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

Это было полезно?

Решение

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

db <- odbcconnect (dsn = "testdsn", uid = "TestUser", pwd = "testpasswd", Believenrows = false)

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

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

Настройка Believenrows = false Решил проблему для меня, чтобы я мог использовать один и тот же R-код в обеих системах.

BTW: Я использую R 2.10.1, RODBC 1.3.2, UnixoDBC 2.3.0 с Oracle 10.2.0.4 на Linux 64 бита. Обязательно используйте

Экспорт 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, Aracle Instant Client. Я спросил список R-SIG-DB, включая пакет автор (проф. Рипли) об этом, и не было убедительного ответа. Затем я попросил революцию, если бы они были готовы решить проблему, если бы мы должны были приобрести из них лицензии (на 5-е годы / год!), И они сказали нет.

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

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

Пытаться max=0 а также believeNRows=FALSE - Это работало для меня.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top