【问题标题】:Inserting statements from .sql file into Oracle database resulting ORA-01704: string literal too long将 .sql 文件中的语句插入 Oracle 数据库导致 ORA-01704:字符串文字太长
【发布时间】:2026-02-13 19:45:02
【问题描述】:

我将数据库表中的一些数据作为插入语句导出到 sql 文件中。 现在我想启动它们,但我收到错误 ORA-01704: string literal too long。 问题原因可能是一个 CLOB 列的 XML 数据超过 4000 个字符。

最好的解决方法是什么? 我在该文件中有大约 50 个 SQL 插入语句。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以将数据保留在分隔文件中,而不是使用插入语句,然后使用SQLLDRexternal tables 查看。外部表很棒。

    【讨论】:

    • 是的,我已经意识到了:) 但是 atm 我只有 SQL 插入语句。
    • 您可以在大约 5 秒内使用体面的文本编辑器和正则表达式将插入语句转换为 CSV 文件!将“插入(a,b,c)值(”替换为“”,然后替换“);”用“”,你就完成了。使用正则表达式锚确保您只获得一行的开始和结束。
    • 你能帮我吗?这是一个 sql 插入的示例: 插入文档 (document_id,recipient_id,folder_is,data,delete_on,previous_version) 值 ('766767','12','0','','to_date( '22.02.2013 13:15:07','DD.MM.RRRR HH24:MI:SS'),null);
    • 你在哪个平台上?你可以访问sed吗?
    • 或者,您可以发布一个新问题“如何将 SQL 插入语句转换为 CSV”,您可能会得到更好的答案!
    【解决方案2】:

    获得大于 4000 字节的内容的方法是使用最多支持 32767 字节的 pl\sql。以下是如何解决 ORA-01704: string literal too long 错误的示例:

    declare
    vClobVal varchar2(32767) := '<Add text string here>';
    begin
    update CLOBTAB set CLOBCOL = vClobVal;
    end;
    

    您还可以将您的 colomun 类型从 varchar2 更改为 CLOB

    也看看这个链接是否可以帮助你 - http://www.dba-oracle.com/t_ora_01704_string_literal_too_long.htm

    【讨论】:

    • 如果它们大于 32767 字节怎么办?我还有 50 个这样的插入语句:INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, TOO_LONG_VALUE,...)
    • @Marko,max size of a clob 在 9i 和 10g 中为 8TB,在 11g 中为 128TB。我怀疑你已经接近极限了。如果它们更大,我会搜索如何使用 clob,因为它会变得有点复杂,因为你必须多次读取/写入。
    【解决方案3】:

    只是考虑一下您应该拆分列的特定列。例如,假设您当前的列是 RANDOM_TEXT,因为 VARCHAR(4000) 它超出了限制,您可以将其拆分为 2 列,例如 RANDOM_TEXT_1 和 RANDOM_TEXT_2,当您编写时,您应该将前 4000 个字符放入第一个 RANDOM_TEXT_1,其余的放入 RANDOM_TEXT_2 .当您将此返回给任何应用程序或任何 api 时,您必须组合并作为单个字符串提供。

    【讨论】:

    • 我没有使用任何应用程序,试图在 sql*plus 中启动文件。
    • 我的意思是您正在加载的数据可能会被其他应用程序使用,这就是我提到的。那么您可能需要一个 pl sql 来分隔大块并放入 2 个不同的列中……这只是一个建议……
    【解决方案4】:

    你可以试试这个,它对我有用:

    DECLARE 
    big_text_  CLOB := 'very very very very long text or XML.......';
    BEGIN
      INSERT INTO table_name (column1, column2, column3_CLOB) VALUES ('value1', 'value2', big_text_);
      COMMIT;
    END;
    

    【讨论】: