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