【发布时间】:2014-02-21 21:19:59
【问题描述】:
我在 mySQL 数据库表中有数据。我正在选择此数据并尝试将其插入到 Netezza 数据库表中。我正在使用 spring 框架,并且有一个名为 Student 的实体类。
mySQL 数据库表中的某些字段是整数格式,但 Netezza 中的等效字段是字符格式。
我正在使用 JDBC 模板并从 mySQL 获取数据并将该 Student 对象插入到 Netezza。
这是我的方法:
String sqlStudent="INSERT INTO STUDENT(STUDENTID,CLASSID,COURSEID,TESTDATE,SCOREDATE) VALUES (?,?,?,?,?)";
netezzaJDBCTemplate.update(sqlStudent,new Object[] {student.getStudentId(),student.getClassId(),student.getCourseId(),student.getTestDate(),student.getScoreDate)});
执行此操作时出现错误。我什至尝试对 INSERT 进行硬编码。
Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO STUDENT(STUDENTID,CLASSID,COURSEID,TESTDATE,SCOREDATE) VALUES (1521995,134,21,'2014-02-15 00:00:00','2014-02-15 00:00:00') )]; nested exception is org.netezza.error.NzSQLException: Parameter Index out of range: 1
这是因为2个数据库的列数据类型不同吗?还是我错过了什么?
请帮忙。
【问题讨论】:
-
为什么
new studentMapper()。 JdbcTemplate 的更新方法不接受RowMapper对吗?您使用任何自定义实现? -
好收获!所以我用值硬编码 INSERT 语句,但仍然得到一个错误 - 嵌套异常是 org.netezza.error.NzSQLException: Parameter Index out of range: 1
-
您似乎在某处设置了
preparedStmt.setXXX(1,xxxx),而当前语句中没有任何?。发布您的完整堆栈跟踪,它可能会有所帮助。 -
@Rp- 我认为这是问题所在(在更新中包含 RowMapper)。您可以将其添加为答案,以便我可以选择它作为答案吗?
-
Netezza 专为批量加载而设计。请不要逐行插入,当他发现时,您的 DBA 会很适合。性能将非常缓慢!使用 ETL 工具,或者生成一个平面文件,然后批量加载,或者将批量数据写入一个 unix 命名管道,然后 Netezza 批量加载器从中读取。