ORA-24816:在实际LONG或LOB列之后提供的扩展非LONG绑定数据

时间:2014-04-28 12:38:52

标签: java hibernate orm oracle11g

我在Hibernate中更新表时遇到异常

ORA-24816:在实际LONG或LOB列之后提供的扩展非LONG绑定数据

我也提取了sql查询,看起来像是

Update table_name set columnName (LOB)=value, colmun2 (String with 4000)=value where id=?;

实体类

class Test{

    @Lob
    private String errorText;

    @Column(length = 4000)
    private String text;
}

请帮助我,这是什么问题

由于 拉维库马尔

6 个答案:

答案 0 :(得分:6)

运行oerr ora 24816以获取有关错误的详细信息:

$ oerr ora 24816
24816, ... "Expanded non LONG bind data supplied after actual LONG or LOB column"
// *Cause:  A Bind value of length potentially > 4000 bytes follows binding for
//          LOB or LONG.
// *Action: Re-order the binds so that the LONG bind or LOB binds are all
//          at the end of the bind list.

因此,仅使用1个查询的另一个解决方案是在所有非LOB / LONG绑定后移动您的LOB / LONG绑定。 Hibernate可能会或可能不会这样。也许更像是:

update T set column2 (String with 4000)=:1, columnName (LOB)=:3 where id=:2;

此DML限制似乎至少存在于Oracle 8i之后。

参考文献:

答案 1 :(得分:3)

我发现了问题。 1.当数据库和实体中的hibernate更新数据有4000个字符列和lob类型列然后hibernate抛出此异常

我已经通过编写两个更新队列解决了这个问题 1.首先我使用Update()保存实体 2.为lob列更新写了另一个更新查询

由于 拉维

答案 2 :(得分:2)

我在oracle db和foudn Hibernate Guys fixed here

中也遇到了同样的错误

在我的情况下,我们已经在使用hiberante 4.3.7,但没有提到该字段是Lob in Entity

重现步骤

  1. 包含varchar2数据类型和clob数据类型的字段。请确保列名称的字母顺序为clob_field,varchar_two_field1,varchar_two_field2。
  2. 现在用<更新clob_field 2000字节和varchar_two_field1,大小为4000字节。
  3. 最终会出现错误 ORA-24816:在实际LONG或LOB列之后提供的扩展非LONG绑定数据
  4. 解决方案

    1. 确保你有hiberante 4.1.8,< 4.3.0.Beta1
    2. 在各个实体中注释您的clob / blob字段

      import javax.persistence.Lob;  
      ...
          @Lob
          @Column(name = "description")
          private String description;  
      ....
      
    3. 如果要查看差异,请在进行上述更改后通过在persistence.xml中为"true"设置"hibernate.show_sql"来启用sql语句的调试。

答案 3 :(得分:2)

我确实知道这个帖子已经很老了,但我想我会在这里分享我自己的相同错误信息以供将来参考。

我有几天完全相同的症状(即ORA-24816)。我遇到的各种线程有点侧面跟踪,表明这与参数绑定的顺序有关。就我而言,这不是问题。此外,我努力重现此错误,它只发生在部署到应用程序服务器后,我无法通过集成测试重现这一点。

但是,我看了一下我绑定参数的代码,发现:

preparedStatement.setString(index, someStringValue);

我将其替换为:

preparedStatement.setClob(index, new StringReader(someStringValue));

这对我有用。

This thread from back in 2009非常有用。

答案 4 :(得分:1)

我在尝试将数据插入表格时遇到了这个问题。要避免此错误,只需在insert语句的末尾保留所有包含" LOB" 数据类型的字段。

例如

  

Table1有8个字段(Field1,Field2,...... Field8等),

其中

  

Field1和Field2属于CLOB数据类型

     

,其余为Varchar2数据类型

。然后在插入数据时,请确保将 Field1和Field2 值保留在最后,如下所示。

 INSERT INTO TABLE1 ( Field3,Field4,Field5,Field6,Field7,Field8,Field1,Field2)  
    Values ('a','b','c','d','e','f','htgybyvvbshbhabjh','cbsdbvsb')

答案 5 :(得分:0)

将LOB绑定放在最后。看看是否能解决问题..