首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用foreach将数据框行插入oracle表

无法使用foreach将数据框行插入oracle表
EN

Stack Overflow用户
提问于 2013-05-08 03:06:07
回答 1查看 136关注 0票数 0

我正在尝试将数据框插入到oracle表中,如下所示:

我的数据框如下所示:

日期

代码语言:javascript
复制
              DATE         LPAR smt lcpu    mem psize ent PercentUsr PercentSys PercentWait
3 2013-05-06 00:02:00 server1   4   96 393216    64  16       25.3        8.9         8.1
4 2013-05-06 00:02:30 server1   4   96 393216    64  16       23.2        8.3         7.8
5 2013-05-06 00:03:00 server1   4   96 393216    64  16       21.5        8.8         9.1
6 2013-05-06 00:03:30 server1   4   96 393216    64  16       23.2        8.8         8.2
7 2013-05-06 00:04:00 server1   4   96 393216    64  16       22.1        8.7         7.5
8 2013-05-06 00:04:30 server1   4   96 393216    64  16       21.9        9.8         8.4
  PercentIdle Physc PercentEntc Lbusy   App  Vcsw Phint
3        57.8  6.36        39.7  21.5 39.67 19650  1636
4        60.7  5.81        36.3  21.1 39.85 16636  1436
5        60.6  5.68        35.5  20.6 40.35 16291  1349
6        59.8  6.02        37.6  21.2 37.92 20199  1495
7        61.7  5.78        36.1  20.0 40.08 18721  1499
8        60.0  6.00        37.5  20.5 40.59 19810  1443

\n

代码语言:javascript
复制
library(RCurl) 
library(RODBC)
library(snow)
library(doSNOW)
library(foreach)

if(nrow(dat)>1) {
                 tryCatch({
                        ch=odbcConnect("<id>",pwd = "<passwd>")
                        sqlSave(ch,dat, tablename="TEST", rownames=FALSE, append=TRUE)
                        },error = function(e) {
                            print("unable to insert the whole data frame, will try by line, next")
                            ch=odbcConnect("<id>",pwd = "<passwd>")

                                foreach(k=1:nrow(dat)) %dopar% {
                                print(dat[k,])
                                        tryCatch({
                                                sqlSave(ch,dat[k,], tablename="TEST", rownames=FALSE, append=TRUE)
                                                },error=function(e) {
                                                    print("unable to insert, duplicate record")
                                                    print(e)
                                                })
                                }
                            odbcClose(ch)

                        })
                        odbcClose(ch)
            }

看起来这部分代码没有被执行,我在这里可能遗漏了什么:

代码语言:javascript
复制
},error = function(e) {
                            print("unable to insert the whole data frame, will try by line, next")
                            ch=odbcConnect("<id>",pwd = "<passwd>")

                                foreach(k=1:nrow(dat)) %dopar% {
                                print(dat[k,])
                                        tryCatch({
                                                sqlSave(ch,dat[k,], tablename="TEST", rownames=FALSE, append=TRUE)
                                                },error=function(e) {
                                                    print("unable to insert, duplicate record")
                                                    print(e)
                                                })
                                }
                            odbcClose(ch)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-08 21:22:48

在使用doSNOW执行此foreach循环时,数据库连接对象ch将自动导出到集群工作程序,但得到的对象几乎肯定不会工作。像文件连接这样的对象不能被序列化并发送到其他进程,也不能正常工作。

您可以尝试在执行foreach循环之前在每个工作进程上创建数据库连接,并使用.noexport='ch'防止它被自动导出,但我同意@joran的意见,即这样做是不值得的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16426678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档