CSV导出导致ORA-01489

时间:2018-03-05 06:24:33

标签: oracle export-to-csv

我使用假脱机工具将数据从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;

1 个答案:

答案 0 :(得分: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