Domanda

errore RODBC in Revolution R 64 bit su winxp64 bit collegato ad Oracle utilizzando un driver 64bit ODBC attraverso un 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

Sono in grado di connettersi, ma ottenere un errore quando interrogo per le cose, anche la sottostante lavori

 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

ma se io non conosco il rowsize (max = 1) prima di mano

Grazie, Arun

È stato utile?

Soluzione

believeNRows = FALSE sembra essere la chiave. Meglio usarlo quando si apre la connessione:

  

db <- odbcConnect (DSN = "testdsn", uid = "testuser", pwd = "testpasswd", believeNRows = FALSE)

Quando il test con isql di unixODBC, riferisce SQLRowCount di essere 4294967295 (anche se c'è solo una riga) su 64 bit Linux mentre si riporta -1 in 32 bit di Linux. Questo è probabilmente un'ottimizzazione in quanto permette risposte più rapide. Si salva il database l'onere di recuperare il set completo di dati di risposta immediatamente. Per esempio. ci potrebbe essere un sacco di record, mentre solo i primi colpi saranno mai recuperati.

4294967295 è (2 ^ 32) -1 che è il valore massimo per un int non firmato, ma sarà tretated come -1 con un int firmata. Così R lamenta su un vettore con lunghezza negativa. Quindi presumo che sia un problema su firmata vs. intero senza segno (o sizeof (long) tra il 32 e 64 bit).

Impostazione believeNRows = FALSE ha risolto il problema per me in modo da poter utilizzare lo stesso codice R su entrambi i sistemi.

A proposito: sto usando R 2.10.1, RODBC 1.3.2, 2.3.0 unixODBC con Oracle 10.2.0.4 su Linux a 64 bit. Assicurarsi di utilizzare

  

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

quando si fa configure per unixODBC come Oracle ODBC si aspetta di driver REAL_64_BIT_MODE, non LEGACY_64_BIT_MODE.

Ed essere consapevoli dei problemi di internazionalizzazione: R utilizza $ LANG mentre Oracle utilizza $ NLS_LANG

.

Ho sperimentato problemi con UTF-8 in modo che uso per esempio

  

LANG = en_US; NLS_LANG = American_America

Altri suggerimenti

L'errore

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

moltissimo appare come un problema di porting a 32-bit / 64-bit così ho gentilmente suggerisco di entrare in contatto con i due fornitori commerciali coinvolti per avere quello fissato. Io preferisco driver di database diretta dove disponibile su ODBC ma non c'è motivo per cui non dovrebbe lavoro come Linux a 64 bit gioca allegramente insieme.

Dirk ha ragione - RODBC non supporta i driver a 64 bit per Oracle, almeno non come di un paio di mesi fa. Si può essere fuori di fortuna. Abbiamo avuto un problema simile cercando di ottenere R per accedere a un database Oracle da una scatola a 64 bit Linux utilizzando i seguenti strumenti: a 64-bit R, RODBC, unixODBC, Oracle Instant client. Ho chiesto l'elenco R-sig-db, compreso il pacchetto autore (Prof. Ripley) di questo, e non c'era nessuna risposta conclusiva. Ho quindi chiesto rivoluzione se sarebbero disposti a risolvere il problema, se dovessimo acquistare licenze da loro (a 5 figure / anno!), E non ha detto.

La mia azienda sta ora cercando di ridurre al minimo l'uso di R per le zone in cui è più adatto. Useremo altri strumenti (servizi Web, sistemi JVM-based) per accedere al database, e la condivisione di dati con R solo quando è necessario.

Il problema fondamentale è che pochissimi grandi utilizzatori di R utilizzano anche Oracle. R viene utilizzato principalmente da accademici (Excel, MySQL), i tipi di finanziamento (Postgres), e più di analisi squadre all'avanguardia. Oracle è utilizzato da vecchie imprese che l'affidabilità del valore sopra l'innovazione, l'esatto contrario di quello che la maggior parte degli usi R stanno cercando. Quindi questo spiega il motivo per cui il supporto per Oracle è caduto via, a mio avviso.

Prova max=0 e believeNRows=FALSE -. Che ha funzionato per me

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top