【发布时间】:2016-02-19 22:08:33
【问题描述】:
我有一个非常令人困惑的问题,我不明白。 我正在为不同的表构建 INSERT 语句,并在最后将它们作为 Batch 执行。
语句是这样构建的:
INSERT INTO table VALUES ('anyValue', 'anyValue', 'anyValue', ...)
表定义不只包含varchar,还有number、float、timestamp,不过没关系,Oracle自己做类型转换
但是... 如果我尝试在 NUMBER 中插入 NULL,它会说无效数字,但例如在 PLSQL 开发人员中,它就像一个魅力。看起来像这样:
INSERT INTO table (varchar, varchar, number, ...) VALUES ('value', 'value', NULL, ...)
我正在使用带有 ojdbc6.jar 库的 Oracle11g 数据库。 我知道上面的语法不正确,但这只是为了澄清类型和我尝试插入的内容。
有没有办法解决这个问题,不用使用preparedStatement和setNull(),因为我不知道运行时的字段类型
编辑
INSERT ALL INTO comediatypeadjustments VALUES('1','TEST','1','DEL_COC_361','DEL_COC_361','100','Y','Y','N','GREEN','Y','Y','N','N','LIGHTGREEN','STD','10.65','STD','55.25','N','N',NULL,NULL,NULL,NULL,'N',NULL,NULL,NULL,NULL,'N',NULL,NULL,NULL,NULL,'Y','WHITE','STD_BOLD_UL','44.25',NULL,NULL,'N','N','N',NULL,'N',NULL,'N',NULL,'N',NULL,NULL,NULL,NULL,'Y','N') INTO comediatypeadjustments VALUES('2','TEST','2','DEL_COC_362','DEL_COC_362','100','Y','Y','N','BLUE','Y','Y','N','N','LIGHTGREEN','STD','10.65','STD','55.25','N','N',NULL,NULL,NULL,NULL,'N',NULL,NULL,NULL,NULL,'N',NULL,NULL,NULL,NULL,'Y','WHITE','STD_BOLD_UL','44.25',NULL,NULL,'N','N','N',NULL,'N',NULL,'N',NULL,'N',NULL,NULL,NULL,NULL,'Y','N') SELECT * FROM DUAL
线程“main”中的异常 java.sql.BatchUpdateException: Fehler bei Stapelverarbeitung aufgetreten: ORA-01722: 无效号码
在 oracle.jdbc.driver.OracleStatement.executeBatch(OracleStatement.java:4586) 在 oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230) 在 de.draexlmaier.pcm.test.testcase.TestCaseHelper.initializeTestData(TestCaseHelper.java:285) 在 de.draexlmaier.pcm.test.testcase.TestCaseHelper.setTestName(TestCaseHelper.java:118) 在 de.draexlmaier.pcm.test.utilities.Main.main(Main.java:19)
【问题讨论】:
-
向我们展示您生成错误的真实语句,并添加您收到的complete错误消息。 编辑您的问题,不要在 cmets 中发布代码。如果我不得不猜测:您正在尝试将字符值放入数字列 - 但如果没有真正的查询,这是不可能回答的。
-
@Fildor 我真诚地希望不要,因为这是无稽之谈。一个更相关的问题是 OP 是否真的尝试过
NULL,没有任何引号。从他发布的不完整证据中无法判断。 -
为什么同一列要列出两次,为什么命名为
varchar? --- 反正要插入NULL,就别提了:INSERT INTO table (varchar, varchar, ...) VALUES ('value', 'value', ...)。number列现在将具有默认值,通常为 NULL。 -
由于您使用的是 Java,我想列和插入的值会有一些映射问题。请先指定列名,然后将 insert 等值放入
(column_1,column_2,column_3,...) values(val1,val2,val3...)
您如何不知道列名但知道表名?以及为什么使用insert all。一个好的旧的普通单行insert语句有什么问题?另外:数字应该不用单引号指定。'55.25'是字符文字,而不是数字。