【问题标题】:JDBC/Oracle insert NULL without preparedStatementJDBC/Oracle 在没有preparedStatement 的情况下插入NULL
【发布时间】: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' 是字符文字,而不是数字。

标签: java oracle jdbc


【解决方案1】:

你可以试试空字符串'',oracle db会把它当作null。

【讨论】:

  • 你在开玩笑。 Oracle 会将字符串文字视为具有空值的数字吗?证据?
【解决方案2】:

由于您使用的是 Java,我想列和插入的值会有一些映射问题。请先指定列名,然后输入像

这样的值
insert into <table>(column_1,column_2,column_3,...) values(val1,val2,val3...); 

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2014-07-17
    • 2016-06-02
    • 2011-02-20
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2023-03-06
    相关资源
    最近更新 更多