我有一個DB2和R連接的奇怪問題。我可以訪問數據庫,但可以查詢數據但我無法從R存儲數據。我使用R的RODBC包。我遵循這裏編寫的指南https://www.ibm.com/developerworks/data/library/techarticle/dm-1402db2andr/index.html從技術上講,此包從R對象創建「INSERT INTO」語句,並且在DB2上執行它以存儲來自R的數據(我有必要的憑據在數據庫上執行這些操作。)將數據從R存儲到DB2不起作用
我試過的是以下內容(我使用R和SQuirreL - http://squirrel-sql.sourceforge.net/ - 一起測試多個單向):
使用SQuirreL創建一個包含3列和25條記錄的測試表。 然後我從R查詢這個表。 我嘗試將結果數據集中的第一條記錄(從2)保存到同一個表中。 然後我從R中查詢表 - 附加行。 然後我從SQuirreL查詢。 這裏的問題發生在這裏,而我連接到R和INSERT後。在(4)我看到添加的記錄,但我無法從SQuirreL(5)中查詢它。 R似乎鎖定了整個桌子。當我用R與數據庫斷開連接時,它不會得到解決,我還會得到2條錯誤消息(我懷疑這些錯誤消息是相關的)。當我退出R然後它解決了,我可以從SQuirreL查詢我的表,但附加的記錄消失。
我試圖從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
謝謝你的幫助,它解決了這個問題。 – ParraghG