ORA-01704:迁移数据库时字符串文字太长

时间:2018-04-11 09:08:21

标签: sql oracle liquibase

我从数据库迁移一些数据并将其放入data.xml文件中 例如:

<insert tableName="ORG_CUSTOMER">
  <column name="My-Column" value="a very long string.."/>
</insert>

然后我用cmd命令执行它

call ..\liquibase\liquibase-bin\liquibase.bat --changeLogFile=%DATA% --defaultSchemaName=NAME_DBA --defaultsFile=liquibase-local.properties update

因为该值有时超过4000个字符,我会收到错误:

  

运行Liquibase时出现意外错误:ORA-01704:字符串文字太长

该列具有价值clob。自动生成的xml文件包含许多我不想手动编辑的插入。我读了一些东西,使它成为一个准备好的声明或使用pl / sql将工作,但我现在不怎么做?

2 个答案:

答案 0 :(得分:0)

如果没有liquibase.bat的代码,很难说但是。

来自documentation on literals

  

文本文字具有CHARVARCHAR2数据类型的属性:

     
      
  • 在表达式和条件中,Oracle通过使用空白填充的比较语义来比较文本文字,就好像它们具有数据类型CHAR一样。
  •   
  • 文本文字的最大长度为4000字节。
  •   

我猜这个脚本是天真地转换XML:

<insert tableName="ORG_CUSTOMER">
  <column name="My-Column" value="a very long string.."/>
</insert>

INSERT INTO {tablename} ( "{column.name}" ) VALUES ( '{column.value}' );

,当文本文字超过4000个字节时,这将失败。

要解决此问题,您需要编辑脚本以处理超过4000个字节的CLOB值(不能使用文本文字)。

答案 1 :(得分:0)

Oracle - 默认情况下 - 字符串文字的限制为4000字节。

如果你在12.1或更新,你可以raise that limit to 32k

如果您使用的是旧版本或无法更改参数,则无法使用Liquibase的<insert>更改。

您可以尝试<loadData>更改并希望它使用PreparedStatement,在这种情况下,限制不适用:

http://www.liquibase.org/documentation/changes/load_data.html