1

WindowsXP上のODBCを介してOracle10gデータベースからデータをプルするスクリプトがいくつかありますが、これらはかなり長い間うまく機能しています。最近、同じデータベースの別のスキーマからデータをプルするために新しいOracleアカウントを設定しましたが、そのアカウントと別のスキーマを使用してテストすると、奇妙な結果が得られ、(確実に)Rを完全に強制終了することがあります。

odbcConnectを使用してデータベースに接続し、believeNRowsとrows_at_timeを試しましたが違いはありません

>imcon<-odbcConnect(sid, uid=uid, pwd=pwd, believeNRows = FALSE, rows_at_time=1)

> odbcGetInfo(imcon)
       DBMS_Name         DBMS_Ver  Driver_ODBC_Ver Data_Source_Name      Driver_Name       Driver_Ver         ODBC_Ver      Server_Name 
        "Oracle"     "10.02.0030"          "03.51"       "SID"    "SQORA32.DLL"     "09.02.0000"     "03.52.0000"       "SID" 

次に、いくつかのクエリを試してみます(できる限り簡単です。これは、ゼロ行を返します(このテーブルには2つの行があります)。ほとんどの列名は、Anの代わりに使用されます。

> sqlQuery(imcon, "select * from SCHEMA.USERS;")
 [1] PASSWORD                  USER_DISABLED             USE_DOMAIN_AUTHENTICATION ID                        DESCRIPTION              
 [6] ADMIN_USER                A                         A.1                       A.2                       A.3                      
[11] A.4                       A.5                       A.6                       A.7                       A.8                      
[16] A.9                       A.10                      A.11                      A.12                      A.13                     
[21] A.14                      A.15                      A.16                      A.17                      A.18                     
[26] A.19                      A.20                      A.21                      A.22                      A.23                     
[31] A.24                      A.25                      A.26                      A.27                      A.28                     
[36] A.29                      A.30                      A.31                      A.32                      A.33                     
<0 rows> (or 0-length row.names)
Warning messages:
1: In deparse(., width.cutoff = max(20, width - 10)) :
  invalid 'cutoff' for deparse, using default
2: In deparse(., width.cutoff = max(20, width - 10)) :
  invalid 'cutoff' for deparse, using default

これは機能しますが、ゼロ行を返し、2つの日付列はLとL.1に切り捨てられます

> sqlQuery(imcon, "select ID, DESCRIPTION, NAME, FIRST_NAME, LAST_NAME, DATE_CREATED, DATE_LAST_MODIFIED from SCHEMA.USERS;")
[1] ID          DESCRIPTION NAME        FIRST_NAME  LAST_NAME   L           L.1        
<0 rows> (or 0-length row.names)

これは正常に機能し、データを返します

> sqlQuery(imcon, "select ID, DESCRIPTION, NAME, FIRST_NAME, LAST_NAME, ADMIN_USER from SCHEMA.USERS;")
  ID DESCRIPTION   NAME FIRST_NAME LAST_NAME ADMIN_USER
1  1        <NA> SYSTEM       <NA>        NA       TRUE
2  2  Admin user  ADMIN      Admin        NA       TRUE

これはRを殺すようです(正直に言って)

> sqlQuery(imcon, "select ID, DESCRIPTION, NAME, FIRST_NAME, LAST_NAME, DATE_CREATED from SCHEMA.USERS;")

Rが死ぬ。(StatEtとRGuiの両方で)

だから私の質問;

a)何が悪いのか誰か知っていますか?

b)誰かが私が診断するために取ることができる他のステップを知っていますか?

4

1 に答える 1

1

少し遊んで問題を単純化しようとした後、SQLPlusからの非常に奇妙な出力に気づきました(列タイトルに非常に長い下線が付いています)。これにより、SQL Developerのデータを確認し、列クラスを表示しました(SQLPlusでもこれを実行できたはずです)。ほとんどのテキストフィールドはvarchar2(4000)または同様のものであり、日付フィールドはタイムゾーン付きの日付スタンプであるように見えます。varcharsは結果が返されるのを止め、datestampsはRを完全に殺すようです。

たとえば、varchar2にsubstrを使用し、datestampにto_charを使用して、これらの列を通常の列に戻すようにクエリを修正しました。

select substr(t1.STATUS_DETAIL,0,24) as DETAIL,
to_char(t1.DATE_CREATED,'YYYY-MM-DD HH24:MI:SS') AS DCREATED 
from SCHEMA.TABLE;

これにより、Rのクラッシュが停止し、結果が返されます。RODBCのパッケージメンテナに電子メールを送り、この問題を抱えている他の人にこの回答を残します。

于 2013-02-27T23:15:24.657 に答える