6

按照此处的说明建立连接后,我尝试将一个非常简单的数据框(trythis如下所示)写入一个名为gh_test_20141105的数据库中的表中p_cia_t。首先,我试过

> conn <- getTdConnection(vdm='vivaldi')
> dbWriteTable(conn=conn,name=tbl,value=trythis)
Error in .verify.JDBC.result(s, "Unable to execute JDBC prepared statement ",  : 
  Unable to execute JDBC prepared statement INSERT INTO p_cia_t.gh_test_20141005 VALUES(?,?,?,?) ([Teradata Database] [TeraJDBC 14.10.00.17] [Error 3932] [SQLState 25000] Only an ET or null statement is legal after a DDL Statement.)

接下来,我在 Teradata 中创建了一个空表:

create table p_cia_t.gh_test_20141105 (eenie integer, meenie integer, minie integer, moe integer);

我接下来两次尝试写入此数据帧以相互矛盾的方式失败:

    > dbWriteTable(conn=conn,name=tbl,value=trythis,append=T)
Error in .local(conn, statement, ...) : 
  execute JDBC update query failed in dbSendUpdate ([Teradata Database] [TeraJDBC 14.10.00.17] [Error 3803] [SQLState 42S01] Table 'gh_test_20141105' already exists.)
> dbWriteTable(conn=conn,name=tbl,value=trythis,append=T,overwrite=F)
Error in .local(conn, name, value, ...) : 
  Cannot append to a non-existing table `p_cia_t.gh_test_20141105'
> trythis
  eenie meenie minie moe
1     1      4     7  10
2     2      5     8  11
3     3      6     9  12
> conn
An object of class "JDBCConnection"
Slot "jc":
[1] "Java-Object{com.teradata.jdbc.jdk6.JDK6_SQL_Connection@2f242b11}"

Slot "identifier.quote":
[1] NA

> tbl
[1] "p_cia_t.gh_test_20141105"

为什么会append=T反对表已存在,以及如何添加overwrite=F将反对更改为“不存在的表”?两者都没有任何意义。

我将非常感谢任何将数据帧成功写入 Teradata 表的工作示例,无论是否预先存在,无论是否附加。

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RJDBC_0.2-4      rJava_0.9-6      DBI_0.3.1        dplyr_0.3.0.2    scales_0.2.4     ggplot2_1.0.0    reshape2_1.4    
[8] RODBC_1.3-10     data.table_1.9.4

loaded via a namespace (and not attached):
 [1] assertthat_0.1   chron_2.3-45     colorspace_1.2-4 digest_0.6.4     grid_3.1.2       gtable_0.1.2     magrittr_1.0.1  
 [8] MASS_7.3-35      munsell_0.4.2    parallel_3.1.2   plyr_1.8.1       proto_0.3-10     Rcpp_0.11.3      stringr_0.6.2   
[15] tools_3.1.2   
4

1 回答 1

4

我认为这是由于 Teradata 的 JDBC 驱动程序中的错误。正如这里所解释的,原因是

问题是在 dbWriteTable RJDBC 禁用自动提交(并在最后再次启用),创建表,然后尝试在同一个事务中插入它。Firebird 不允许插入在同一事务中创建的表中。

这个页面似乎提供了一个解决方案,但我认为从根本上说我们可能不得不等到 TD 修复这个错误......

我的临时解决办法是转用ODBC(小表)或者直接通过system(“fastload < your_fastload_script”) (大表)调用fastload……</p>

于 2014-11-06T02:11:41.960 回答