java.sql.SQLException:ORA-00932:不一致的数据类型:预期 DATE 在插入 Null 时间戳时得到 BINARY

Posted

技术标签:

【中文标题】java.sql.SQLException:ORA-00932:不一致的数据类型:预期 DATE 在插入 Null 时间戳时得到 BINARY【英文标题】:java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY while Inserting Null timestamp 【发布时间】:2017-10-29 11:53:19 【问题描述】:

我有一个插入查询,与其他字段一起,我正在插入时间戳。现在,每当 Timestamp 的值为 null 时,我都会收到错误消息 -

java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY

我正在使用 oracle 11g。

查询是:

@Modifying
@Query(value ="INSERT INTO mams_asset a ( a.mams_asset_id, a.mams_folder_id, a.asset_name, a.gist, a.last_modified_date, a.last_exported_date, a.created_date ) VALUES (hextoraw(?1), hextoraw(?2), ?3, ?4, ?5, ?6 , ?7)" , nativeQuery = true)
int insertIntoMamsAsset(String mamsAssetId, String mamsFolderId, String assetName, String gist, Timestamp lastModifiedDate, Timestamp lastExportedDate, Timestamp createdDate);

这是 Spring Data JPA 之一。我也尝试过使用这种方法,但同样的错误:

public int insertIntoMamsAsset(String mamsAssetId, String mamsFolderId, String assetName, String gist, Timestamp lastModifiedDate, Timestamp lastExportedDate, Timestamp createdDate)

        final Query query = entityManager.createNativeQuery("INSERT INTO mams_asset a ( a.mams_asset_id, a.mams_folder_id, a.asset_name, a.gist, a.last_modified_date, a.last_exported_date, a.created_date ) VALUES (hextoraw(?), hextoraw(?), ?, ?, ?, ? , ?)")
                .setParameter(1, mamsAssetId)
                .setParameter(2,mamsFolderId)
                .setParameter(3,assetName)
                .setParameter(4,gist)
                .setParameter(5,lastModifiedDate)
                .setParameter(6,lastExportedDate)
                .setParameter(7,createdDate);

        return query.executeUpdate();


    

虽然查询看起来很长,但您可以只关注产生错误的时间戳字段。

解决这个问题的方法是什么?

【问题讨论】:

【参考方案1】:

这对我有用

 final Query query = entityManager.createNativeQuery("INSERT INTO mams_asset a ( a.mams_asset_id, a.mams_folder_id, a.asset_name, a.gist, a.last_modified_date, " +
                "a.last_exported_date, a.created_date ) VALUES (hextoraw(?), hextoraw(?), ?, ?, ?, ? , ?)")
                .setParameter(1, mamsAssetId)
                .setParameter(2, mamsFolderId)
                .setParameter(3, assetName)
                .setParameter(4, gist)
                .setParameter(5, lastModifiedDate, TemporalType.TIMESTAMP)
                .setParameter(6, lastExportedDate, TemporalType.TIMESTAMP)
                .setParameter(7, createdDate, TemporalType.TIMESTAMP);

我在 setParameter 中添加了TemporalType.TIMESTAMP

【讨论】:

【参考方案2】:

它发生的原因是您的表不承认 last_modified_date 的空值。

在像这样启动查询之前尝试检查输入值 lastModifiedDate 是否为 null 或 no

if(lastModifiedDate = null)
Timestamp myModifiedDate = new Timestamp(0001-01-01 00:00:00);

或者像这样简单地更改数据库:

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

【讨论】:

【参考方案3】:

当您尝试从不同类型的列中插入值以获取更多详细信息时,会出现此 Oracle 消息:

http://www.dba-oracle.com/sf_ora_00932_inconsistent_datatypes_expected_string_got_string.htm

现在插入日期值更好地使用 Calendar 类或 Date 类。

【讨论】:

以上是关于java.sql.SQLException:ORA-00932:不一致的数据类型:预期 DATE 在插入 Null 时间戳时得到 BINARY的主要内容,如果未能解决你的问题,请参考以下文章

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

java.sql.SQLException: - ORA-01000: 超过最大打开游标

JDBC Oracle 错误:java.sql.SQLException: ORA-12592: TNS:bad packet