【问题标题】:dbWriteTable: Only an ET or null statement is legal after a DDL Statement.)dbWriteTable:只有在 DDL 语句之后的 ET 或空语句是合法的。)
【发布时间】:2018-12-04 17:17:52
【问题描述】:

我能够读取数据。但是,将数据写入 Teradata 数据库时,出现以下错误:

   Error in .verify.JDBC.result(s, "Unable to create JDBC prepared 
   statement ",  : 
   Unable to create JDBC prepared statement INSERT INTO 
   dl_nbu.alex_test2 VALUES(?,?) ([Teradata Database] 
   [TeraJDBC 16.10.00.07] [Error 3932] [SQLState 25000] Only an ET or 
   null statement is legal after a DDL Statement.)

这是我的代码:

     dbWriteTable(tdConnection, "dl_nbu.alex_test2", all_files4)

【问题讨论】:

  • 发布您的数据样本。另外:您使用什么包连接到 SQL?
  • 嗨,卡洛斯。我正在使用 RJDBC。我拥有的数据只有两个字符列。
  • 错误信息表明之前有一个未提交的 DDL 语句。 Create Table? DATABASE xxx?你能检查一下 Teradata 的 QueryLog 实际发送了什么吗?
  • 有人有什么建议吗?

标签: r teradata rjdbc


【解决方案1】:

没有细节很难给出答案。但请查看 RJDBC 帮助页面:

由于JDBC可以与各种各样的数据库进行对话,所以事先并不知道数据库所理解的SQL方言。因此,RJDBC 实现尝试遵守 SQL92 标准,但并非所有数据库都兼容。这主要影响必须自动生成 SQL 代码的函数,例如 dbWriteTable。一项主要功能是支持带引号的标识符。 SQL92 标准使用双引号,但许多数据库引擎要么不支持它,要么使用其他字符。这 identifier.quote 参数允许您为使用的数据库设置正确的引号字符。例如 MySQL 需要 identifier.quote="`"。如果设置为 NA,则禁用引用标识符的功能,这会对可用于表和字段的名称造成限制。其他功能不受影响。

试试这个,看看会发生什么:

allfiles4 -> allFilesFour
dbWriteTable(tdConnection, "testTwo", allFilesFour)

如果可行,则问题出在引号标识符中。将您建立连接的行更改为:

tdConnection <- dbConnect( JDBC( identifier.quote = "`" ), ...

查看此帖子:Do different databases use different name quote?

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多