2017-08-21 18 views
0

DB2とRの接続に奇妙な問題があります。私はDBにアクセスすることができます、データを照会することができますが、私はRからそれを保存することはできません。私はRのRODBCパッケージを使用します。私はここに書かれたガイドに従ってhttps://www.ibm.com/developerworks/data/library/techarticle/dm-1402db2andr/index.html技術的にこのパッケージは、Rオブジェクトから "INSERT INTO"RからDB2へのデータの保存ができません

私が試したことは、以下のことです(RとSQuirreL-http://squirrel-sql.sourceforge.net/を一緒に使用して、より多くをテストします)。一方向):

3つの列と25個のレコードを持つテストテーブルをSQuirereLで作成する。 その後、Rからこのテーブルをクエリします。 結果セットのデータセット(2から)の最初のレコードを同じテーブルに保存しようとしました。 次に、追加された行を使ってR - からテーブルをクエリします。 その後、私はSquirreLからの問い合わせをします。 ここに問題が発生しますが、私はRに接続されており、INSERTの後に問題が発生しています。 (4)で追加されたレコードが表示されますが、SQuirreL(5)から照会できません。 Rがテーブル全体をロックしているようです。 RでDBから切断すると解決されません。また、2つのエラーメッセージが表示されます(これらは関連していると思われます)。 Rを終了すると、それが解決され、SQueryLからテーブルを照会できますが、追加されたレコードは消えます。

Rから送信されたSQuirreLから同じSQL文を実行しようとしましたが、エラーメッセージが表示されず、レコードが追加されました。したがって、Rによって使用される方法が機能するはずです。私はそれが横向きにどこに行くのか分かりません。

私のテーブルと使用されているRスクリプト(ランタイムメッセージを含む)からサンプルデータを添付しました。以下はCREATE TABLEステートメントです。テーブルにはまだインデックスやキーがありませんので、重複レコードの追加は禁止されていません。

 create table dm_quant.test (
     r_date   date, 
     cid    varchar(255), 
     priv_person  varchar(255) 
    ); 

誰も同じ困難に直面したことがありますか?もしそうなら、私はそれをどのように解決できますか?

ありがとうございます!

#connect-to-db2 
    rm(list=ls(all=TRUE)) 
    gc(reset = TRUE) 

    require(RODBC) 

    dsn_name <- "DB2_DB" 
    user <- "user" 
    pwd <- "pass" 


    channel <- odbcConnect(dsn = dsn_name, uid = user, pwd) 

    table_list <- sqlTables(channel, tableType = "TABLE", schema = "DM_QUANT") 
    cat("There are", nrow(table_list), "tables in the DM_QUANT schema.\n") 
    # There are 4 tables in the DM_QUANT schema. 

    table_name <- "DM_QUANT.TEST" 
    col_list <- sqlColumns(channel, table_name) 
    cat("There are", nrow(col_list), "columns defined in", table_name,"\n") 
    # There are 3 columns defined in DM_QUANT.TEST 

    ## Fetch test table (25 records) 
    test_tbl <- sqlQuery(channel, paste("SELECT * FROM ", table_name, sep = ""), 
         as.is = TRUE, na.strings = "") 

    ## Determine varTypes parameter for sqlSave 
    db2_var_types <- data.frame(var = col_list$COLUMN_NAME, 
           var_type = col_list$TYPE_NAME, 
           var_type_ext = paste(col_list$TYPE_NAME, "(", col_list$COLUMN_SIZE, ")", sep = ""), 
           stringsAsFactors = F) 

    db2_var_types$final_var_type <- db2_var_types$var_type 

    ## Adding size for VARCHAR variable type. 
    db2_var_types$final_var_type[db2_var_types$var_type == "VARCHAR"] <- db2_var_types$var_type_ext[db2_var_types$var_type == "VARCHAR"] 


    ## Append - append 1st record of the current table again. 
    sqlSave(channel, test_tbl[1,], tablename = table_name, append = T, verbose = T, 
      fast = F, rownames = F, colnames = F, varTypes = db2_var_types$final_var_type) 
    # Query: INSERT INTO DM_QUANT.TEST ("R_DATE", "CID", "PRIV_PERSON") VALUES ('2016-06-30', '193303', 'N') 

    ## After I use sqlSave I cannot query from the database from SQuirreL SQL Client. 
    ## Seems like I'm locking the whole table by R. 

    ## Test append 
    ## customer_test <- sqlFetch(channel, table_name) 
    test_append <- sqlQuery(channel, paste("SELECT * FROM ", table_name, sep = ""), 
           as.is = TRUE, na.strings = "") 

    nrow(test_append) 
    # [1] 26 
    nrow(test_append) == nrow(test_tbl) + 1 
    # [1] TRUE 

    ## Append seems successfull 
    cat("Record appended successfully.\n") 


    ## Close connections 
    odbcCloseAll() 
    cat("Database connections are closed.\n") 

    ## Always closes with 2 error message 
    # 1: [RODBC] Error in SQLDisconnect 
    # 2: [RODBC] Error in SQLFreeconnect 

    ## I still cannot query from SQuirreL SQL Client untill I close R completely 
    ## After I close and test query from SQuirreL, I cannot see the appended record. 

私がテストに使用したExcelファイル。

 **sample-data** 
    R_DATE  CID PRIV_PERSON 
    2016.06.30 193303 N 
    2016.06.30 808739 N 
    2016.06.30 585008 N 
    2016.06.30 479872 N 
    2016.06.30 350290 N 
    2016.06.30 895961 N 
    2016.06.30 822839 N 
    2016.06.30 746603 N 
    2016.06.30 174107 N 
    2016.06.30 858942 N 
    2016.06.30 710500 N 
    2016.06.30 513533 N 
    2016.06.30 303993 N 
    2016.06.30 14983 N 
    2016.06.30 91401 N 
    2016.06.30 364451 N 
    2016.06.30 147311 N 
    2016.06.30 165897 N 
    2016.06.30 988524 N 
    2016.06.30 445691 N 
    2016.06.30 119082 N 
    2016.06.30 4668 N 
    2016.06.30 8910 N 
    2017.12.31 377879 
    2016.06.30 531661 N 

答えて

0

無効な自動コミットはこの動作を説明します。更新または挿入された行は、コミットされるまで排他的にロックされたままです。強制的に接続を閉じると、変更がロールバックされる可能性があります。

接続を確立した直後にodbcSetAutoCommit(channel, autoCommit = TRUE)を試してください。また、sqlSave()の後にodbcEndTran(channel, commit = TRUE)を発行することもできます。

+0

ご協力いただきありがとうございます。問題を解決しました。 – ParraghG

関連する問題