【问题标题】:ORA-01704: string literal too long when migrating databaseORA-01704: 迁移数据库时字符串文字太长
【发布时间】:2018-04-11 09:08:20
【问题描述】:

我从数据库中迁移了一些数据并将其保存在 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: string literal too long

该列的值是 clob。自动生成的 xml 文件包含很多我不想手动编辑的插入。我读了一些使它成为准备好的语句或使用 pl/sql 的东西,但我现在不知道该怎么做?

【问题讨论】:

    标签: sql oracle liquibase


    【解决方案1】:

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

    如果您使用的是 12.1 或更高版本,您可以raise that limit to 32k

    如果您使用的是旧版本或无法更改参数,则无法使用 Liquibase 的&lt;insert&gt; 更改。

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

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

    【讨论】:

      【解决方案2】:

      没有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 值(不能使用文本文字)。

      【讨论】:

      • 这不是答案。
      猜你喜欢
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多