CSV导出导致ORA-01489

问题描述 投票:0回答:1

我使用假脱机工具将数据从Oracle 10g数据库导出到CSV文件。但是在导出多行,184170行后,我收到以下错误:

错误:ORA-01489:字符串连接的结果太长

我在我的表中有一个字段FIELD2,它是VARCHAR2(4000 BYTE)类型,我有一些包含4000个字符的行。我的选择请求如下:

select FIELD1 ||'|'||FIELD2 ||'|'||FIELD3 from table;

没有截断FIELD2,有没有解决方案?

所以问题是因为我的选择请求太长了。以下是生成请求的函数:

create or replace FUNCTION build_select (
  p_table_name   IN VARCHAR2
)
    RETURN VARCHAR2
AS
    l_ret   VARCHAR2 (32767);
BEGIN
    FOR eachcol IN (  SELECT column_name, data_type
                           , LEAD (column_name)
                                 OVER (
                                     PARTITION BY table_name ORDER BY column_id
                                 )
                                 next_column
                        FROM all_tab_cols
                       WHERE table_name = p_table_name
                    ORDER BY column_id)
    LOOP
      IF eachcol.data_type = 'CLOB' THEN
        l_ret   := l_ret || 'dbms_lob.substr( '||eachcol.column_name||', 3000, 1 )'|| CASE WHEN eachcol.next_column IS NULL THEN NULL ELSE ' ||''|''||' END;
      ELSE 
        l_ret   := l_ret || eachcol.column_name|| CASE WHEN eachcol.next_column IS NULL THEN NULL ELSE ' ||''|''||' END;
      END IF;
    END LOOP;

    IF l_ret IS NULL
    THEN
        raise_application_error (-20001, 'table ' || p_table_name || ' not found');
    END IF;

    l_ret   := 'select ' || l_ret || ' from ' || p_table_name || ';';

    RETURN l_ret;
END build_select;
oracle export-to-csv
1个回答
0
投票

你说

FIELD2,在我的表中是VARCHAR2(4000 BYTE),你有一些包含4000个字符的行,

选择列为select field1,field2,field3时,没有问题。但是,因为你使用“|”将它们连接在一起,最后一个字符串超过4000个字符,这是VARCHAR2列的限制。因此,Oracle会抛出错误,因为您甚至不能拥有隐含数据类型为VARCHAR2的别名列,超过4000个字符。

一种选择是使用

set colsep '|' 

在您的SQL * Plus会话中,只需选择它

select field1,field2,field3 from yourtable

另一种选择是使用CLOB函数将结果显式地转换为TO_CLOB

select TO_CLOB(NULL)||FIELD1 ||'|'||FIELD2 ||'|'||FIELD3 from table;

DEMO

© www.soinside.com 2019 - 2024. All rights reserved.