【问题标题】:sqlSave Updating Oracle DB Table -not working for Date fieldsqlSave 更新 Oracle 数据库表 - 不适用于日期字段
【发布时间】:2014-09-17 10:43:56
【问题描述】:

我有一个如下的数据集

> head(resultsclassifiedfinal_MC_TC_P1)
  FEEDBACK_NUMBER Biz_Div_Num ACCURACY Category_Num CLASSIFIED_BY ACTIVE_IND CRT_BY_USR_NUM
1   20140211-1173         556   99.48%         2303           CMC          1         SYSTEM
2   20140211-1886         556    99.6%         2232           CMC          1         SYSTEM
3   20140209-0115         556   66.09%         2232           CMC          1         SYSTEM
4   20140202-0337         556    93.7%         2232           CMC          1         SYSTEM
5   20140203-0418         552      50%         2232           CMC          1         SYSTEM
6   20140303-1339         552   54.45%         2232           CMC          1         SYSTEM

我可以将这些记录插入到 Oracle DB 中已经存在的表中

> library(RODBC)
> channel <- odbcConnect("R", uid="xxx", pwd="xxx@123") 
> sqlSave(channel,resultsclassifiedfinal_MC_TC_P1, tablename="table1", rownames=FALSE, append=TRUE,fast = FALSE,nastring = NULL)
> odbcClose(channel)

到 Oracle Db 中的 table1 - 我添加另一列 CRT_DTTM。 我的表结构如下

tmp <- sqlColumns(channel, "table1") 
> varspec <- tmp$TYPE_NAME
> varspec
[1] "VARCHAR2" "VARCHAR2" "VARCHAR2" "VARCHAR2" "VARCHAR2" "DECIMAL"  "VARCHAR2" "DATE"    

在 R Dataframe 中 - 我添加一列(对应于 Oracle 中的新列)

resultsclassifiedfinal_MC_TC_P1$CRT_DTTM <- Sys.Date()
FEEDBACK_NUMBER Biz_Div_Num ACCURACY Category_Num CLASSIFIED_BY ACTIVE_IND CRT_BY_USR_NUM   CRT_DTTM
1   20140211-1173         556   99.48%         2303           CMC          1         SYSTEM 2014-07-25
2   20140211-1886         556    99.6%         2232           CMC          1         SYSTEM 2014-07-25
3   20140209-0115         556   66.09%         2232           CMC          1         SYSTEM 2014-07-25
4   20140202-0337         556    93.7%         2232           CMC          1         SYSTEM 2014-07-25
5   20140203-0418         552      50%         2232           CMC          1         SYSTEM 2014-07-25
6   20140303-1339         552   54.45%         2232           CMC          1         SYSTEM 2014-07-25

当我尝试插入 table1 时,出现以下错误

> library(RODBC)
> channel <- odbcConnect("R", uid="wl_XXX", pwd="XXX@123") 
> sqlSave(channel,resultsclassifiedfinal_MC_TC_P1, tablename="table1", rownames=FALSE, append=TRUE,fast = FALSE,nastring = NULL)
Error in sqlSave(channel, resultsclassifiedfinal_MC_TC_P1, tablename = "table1",  : 
  unable to append to table ‘table1’
> odbcClose(channel)

问题在于新添加的CRT_DTTM

> sapply(resultsclassifiedfinal_MC_TC_P1,class)
FEEDBACK_NUMBER    CLASS_DIV_CD        ACCURACY   CLASS_CATG_CD   CLASSIFIED_BY      ACTIVE_IND 
       "factor"        "matrix"        "factor"        "matrix"        "factor"       "numeric" 
 CRT_BY_USR_NUM        CRT_DTTM 
    "character"          "Date" 

> sapply(resultsclassifiedfinal_MC_TC_P1,mode)
FEEDBACK_NUMBER    CLASS_DIV_CD        ACCURACY   CLASS_CATG_CD   CLASSIFIED_BY      ACTIVE_IND 
      "numeric"       "numeric"       "numeric"       "numeric"       "numeric"       "numeric" 
 CRT_BY_USR_NUM        CRT_DTTM 
    "character"       "numeric" 

R 和 Oracle 中该列的数据类型是 Date - 但它不起作用。我收到错误。 任何人都可以帮忙吗?

更新:

为了让问题更简单,请。在 R

中找到下面的“table1”
              FN   CRT_DTTM
1  20140526-0006 2014-07-30
2  20140528-0005 2014-07-30
3  20140613-0065 2014-07-30
4  20140528-0002 2014-07-30
5  20140522-0004 2014-07-30

 str(table1)
'data.frame':   5 obs. of  2 variables:
 $ FN      : Factor w/ 5 levels 
 $ CRT_DTTM: Date, format: "2014-07-30" "2014-07-30" "2014-07-30" ...

我无法将此列插入 Oracle DB。(我在 Oracle 中有一个表,其中只有 2 个字段,类型为 varchar2 和 Date)。如果我将我的CRT_DTTM 列转换为 R 中的字符,然后在 Oracle(开发)中将日期类型更改为 varchar2 - 它正在插入。但是,我无法在 Oracle(生产中)中更改我的数据类型

【问题讨论】:

  • 您可以将其作为字符串导入,然后使用 Oracle DB 的 TO_DATE 函数吗?
  • 我直接从 R 更新到 Orcale DB,我无法更改我的数据类型。所以我不能做 to_date
  • 有人可以帮忙,错过一些基本的东西,不知道该怎么做,R中的任何解决方法
  • 你试过this answer吗?从 Oracle 会话的 NLS_DATE_FORMAT 设置中获取日期格式。或者在数据库连接数据库后执行ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD

标签: r oracle type-conversion rodbc


【解决方案1】:

Oracle 的默认日期格式是“DD-MON-YY”。 所以我写了下面的代码:

now <- format(Sys.time(), "%d-%b-%y")
resultsclassifiedfinal_MC_TC_P1$CRT_DTTM <- now
resultsclassifiedfinal_MC_TC_P1$UPD_DTTM <- now

在此之后,我可以使用 date feild 更新数据库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多