CREATE OR REPLACE TYPE t_clob_tab as table of clob;
declare
l_clob_tab t_clob_tab;
begin
-- collect some data as clobs into a nested table
select
cast(multiset(
select to_clob(object_name)
from dba_objects
where rownum <= 10)
as t_clob_tab)
into l_clob_tab
from dual;
-- show the data
for i in 1 .. l_clob_tab.count
loop
dbms_output.put_line('Clob' || i || ' Value is: ' || l_clob_tab(i));
end loop;
end;
输出:
Clob1 Value is: C_OBJ#
Clob2 Value is: I_OBJ#
Clob3 Value is: TAB$
Clob4 Value is: CLU$
Clob5 Value is: C_TS#
Clob6 Value is: I_TS#
Clob7 Value is: C_FILE#_BLOCK#
Clob8 Value is: I_FILE#_BLOCK#
Clob9 Value is: C_USER#
Clob10 Value is: I_USER#
至于LOB类型CAST功能支持:
CAST不直接支持任何的LOB数据类型。当您使用 CAST将CLOB值转换为字符数据类型或BLOB值时,数据库会将LOB 值隐式转换为字符或原始数据,然后将结果值 显式转换为目标值数据类型。如果结果值大于目标类型 ,则数据库返回错误。
这似乎指的是从CLOB - > Varchar转换。但是如果你已经有了Clobs,你应该可以把它们放到一个集合中(在这种情况下是一个嵌套表格)。
我通常使用CAST + MULTISET而不是COLLECT,我认为它更简单,不那么挑剔。我认为你的问题在于COLLECT + CAST,而不是CAST本身(与NUMBER精度类似的问题)。
编辑: 我删除了使用收集功能的任何建议,虽然我可以在一个简单的选择中使用它没有错误,我不能在pl/sql中使用它。此外,除了上述(SQL或PL/SQL)的CAST + MULTISET选项,你可以(在PL/SQL反正)简单地做:
select clob_col
bulk collect into l_clob_tab
from t;
希望有所帮助。
你不能使用具有'CLOB'参数的'COLLECT',它会抛出'00932。 00000 - “不一致的数据类型:预期的%s得到%s”错误。至少它对我不起作用...... +1为'MULTISET'方法。 –
@PrzemyslawKruglej谢谢你。我可以使用带有CLOB的COLLECT(从t中选择collect(clob_val)),但Oracle不喜欢带CLOB的CAST + COLLECT。不知道为什么说实话,但我有CAST + COLLECT的其他问题,所以我避免它,并使用multiset。 – tbone
您正在使用哪个版本的Oracle?我有最新的11g版本之一...想知道为什么收集不适合我。 –