7

DSN を介して 64 ビット ODBC ドライバーを使用して Oracle に接続された winxp64 ビット上の Revolution R 64 ビットでの RODBC エラー

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

しかし、事前に行サイズ(最大= 1)がわからない場合はどうなりますか

ありがとう、アルン

4

4 に答える 4

20

believeNRows=FALSE が鍵のようです。接続を開くときに使用するのが最適です。

デシベル <- odbcConnect(dsn="testdsn"、uid="testuser"、pwd="testpasswd"、beliveNRows=FALSE)

unixODBC の isql でテストすると、64 ビット Linux では SQLRowCount が 4294967295 (行が 1 つしかない場合でも) と報告され、32 ビット Linux では -1 と報告されます。より迅速な回答が可能になるため、これはおそらく最適化です。これにより、完全な応答データ セットをすぐに取得するというデータベースの負担が軽減されます。たとえば、最初の数件のヒットしか取得されないのに、多くのレコードが存在する場合があります。

4294967295 は unsigned int の最大値である (2^32)-1 ですが、signed int では -1 として扱われます。したがって、R は負の長さのベクトルに文句を言います。したがって、符号付き整数と符号なし整数 (または 32 ビットから 64 ビットの間の sizeof(long)) に関する問題だと思います。

believeNRows=FALSE を設定することで問題が解決したので、両方のシステムで同じ R コードを使用できます。

ところで:Linux 64ビットでR 2.10.1、RODBC 1.3.2、unixODBC 2.3.0をOracle 10.2.0.4で使用しています。必ずご利用ください

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

Oracle ODBC ドライバーが LEGACY_64_BIT_MODE ではなく REAL_64_BIT_MODE を想定しているため、unixODBC の構成を行う場合。

また、国際化の問題にも注意してください。R は $LANG を使用しますが、Oracle は $NLS_LANG を使用します。

UTF8で問題が発生したので、たとえば使用します

LANG=en_US; NLS_LANG=American_America

于 2010-08-10T13:43:59.177 に答える
1

Dirkは正しいです-RODBCは、少なくとも数か月前の時点では、Oracle用の64ビットドライバーをサポートしていません。あなたは運が悪いかもしれません。次のツールを使用して、Rが64ビットLinuxボックスからOracleデータベースにアクセスしようとしても同様の問題が発生しました:64ビットR、RODBC、unixODBC、OracleInstantClient。これについて、パッケージ作成者(リプリー教授)を含むR-sig-dbリストに聞いたところ、決定的な答えはありませんでした。次に、Revolutionに、問題を解決してくれるかどうか、ライセンスを購入するかどうか(5桁/年!)を尋ねたところ、いいえと答えました。

私の会社は現在、Rの使用を最適な領域に最小限に抑えようとしています。他のツール(Webサービス、JVMベースのシステム)を使用してデータベースにアクセスし、必要な場合にのみRとデータを共有します。

根本的な問題は、Rの主要なユーザーがOracleを使用していることはほとんどないということです。Rは主に、学者(Excel、MySQL)、財務タイプ(Postgres)、およびその他の最先端の分析チームによって使用されます。オラクルは、イノベーションよりも信頼性を重視する古い企業で使用されています。これは、ほとんどのRが求めているものとは正反対です。私の見解では、これがOracleのサポートが失われた理由を説明しています。

于 2010-08-04T17:26:53.247 に答える
1

エラー

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

32ビット/64ビットの移植の問題のように見えるので、関係する2つの商用ベンダーに連絡して修正することをお勧めします。ODBCよりも利用可能な場合はダイレクトデータベースドライバーを好みますが、64ビットLinuxが楽しく機能するため、直接データベースドライバーが機能しない理由はありません。

于 2010-08-04T15:24:05.983 に答える
1

試してみてくださいmax=0-believeNRows=FALSEそれは私にとってはうまくいきました。

于 2010-08-10T11:25:28.297 に答える