2017-08-21 5 views
0

J'ai un problème étrange avec la connectivité DB2 et R. Je peux accéder à la base de données, interroger les données mais je ne peux pas les stocker depuis R. J'utilise le paquet RODBC de R. J'ai suivi le guide écrit ici https://www.ibm.com/developerworks/data/library/techarticle/dm-1402db2andr/index.html techniquement ce paquet crée une instruction "INSERT INTO" à partir de l'objet R et l'exécute sur DB2 pour stocker les données de R. (J'ai les informations d'identification nécessaires pour exécuter ces opérations sur la base de données.)Le stockage des données de R vers DB2 ne fonctionne pas

Ce que j'ai essayé est le suivant (j'utilise R et SQuirreL - http://squirrel-sql.sourceforge.net/ - ensemble pour tester plus de one way):

Création d'une table de test avec 3 colonnes et 25 enregistrements avec SQuirreL. Ensuite, je interroge cette table à partir de R. J'essaie de sauvegarder le premier enregistrement de l'ensemble de données résultant (à partir de 2) dans la même table. Ensuite, je interroge la table à partir de R - avec la ligne ajoutée. Ensuite, je demande à SQuirreL. Le problème se produit ici, alors que je suis connecté à R et après l'INSERT. En (4) je vois l'enregistrement ajouté, mais je ne peux pas l'interroger à partir de SQuirreL (5). Il semble que R ait verrouillé toute la table. Il n'est pas résolu lorsque je me déconnecte de la base de données avec R, je reçois aussi 2 messages d'erreur (je suppose que ceux-ci sont liés). Lorsque je quitte R, il est résolu et je peux interroger ma table à partir de SQuirreL, mais l'enregistrement ajouté disparaît.

J'ai essayé d'exécuter la même instruction SQL à partir de SQuirreL qui est envoyée par R. Je n'obtiens aucun message d'erreur et l'enregistrement est ajouté. Par conséquent, la méthode utilisée par R devrait fonctionner. Je ne sais pas d'où ça va.

J'ai joint un exemple de données de ma table et le script R utilisé (messages d'exécution inclus). Voici l'instruction CREATE TABLE. La table n'a pas encore d'index ou de clés, donc l'ajout d'un enregistrement en double n'est pas interdit.

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

Avez-vous rencontré les mêmes difficultés? Si oui, comment puis-je le résoudre?

Merci d'avance!

#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. 

Le fichier Excel que j'ai utilisé pour le test.

 **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 

Répondre

0

Une validation automatique désactivée expliquerait ce comportement. Les lignes mises à jour ou insérées restent verrouillées exclusivement jusqu'à leur validation. Lorsque vous fermez la connexion de force, les modifications sont probablement annulées.

Essayez immédiatement odbcSetAutoCommit(channel, autoCommit = TRUE) après avoir établi la connexion. Vous pouvez également émettre odbcEndTran(channel, commit = TRUE) après votre sqlSave().

+0

Nous vous remercions de votre aide, Il a résolu le problème. – ParraghG