我有一个要求,我必须从clob
数据类型中获取数据,转换为 varchar2,以便为 oracle 10g 提供数据透视。
我正在使用以下
select max(case
when key='abc'
then dbms_lob.substr(value)
end) as data_abc
from table.
如果该值小于 4000,则上述查询可以正常工作,但如果大于 4000,则会显示缓冲区限制错误。在阅读了几篇博客后,我了解到dbms_lob.substr()
在 sql 中只能处理 4000 个字符,但在 pl/sql 语句中最多可以处理 32k。
如果我编写一个程序并运行它,它工作正常。但我想在函数中使用它。以下是我的功能:
create or replace FUNCTION CLOBTOVARCHAR
RETURN varchar2 is out_attribute_var varchar2(32767) ;
BEGIN
FOR i IN (select attribute_Value from car_course_attribute where id=1547156)
LOOP
out_attribute_var := dbms_lob.substr(i.attribute_Value, 32000, 1);
END LOOP;
RETURN out_attribute_var;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001, 'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END CLOBTOVARCHAR;
如果数据很小,它可以正常工作,但如果数据大于 4k,它会返回相同的错误。现在我有两个问题:1)我是否正确地将clob
varchar2 转换为我想要获得枢轴 2)我的函数是否正确?