【发布时间】:2018-08-12 18:17:02
【问题描述】:
我正在使用假脱机工具将数据从我的 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;
【问题讨论】:
-
使用
SET colsep '|'获取管道分隔的记录。以select field1,field2,field3 from table的形式运行查询 -
@KaushikNayak:不,我不能这样做,因为我有一个函数可以像这样构建我的选择请求。
-
然后改变你的功能。否则你可能不得不使用
CLOB。 -
@KaushikNayak:这就是我的问题所在。如果我使用 CLOB,生成的 csv 将不包含所有行。我正在使用 dbms_lob.substr 函数导出 CLOB。
-
您在问题中的什么地方解释说您有一个函数或“使用
dbms_lob.substr导出 CLOB?清楚地解释您想要实现的目标并提供一些可能有用的问题背景找到解决方案并避免混淆。
标签: oracle export-to-csv