2013-11-21 97 views
0

我需要选择几个clobs作为嵌套表。在clobs上收集函数

create table t (vc_val varchar2(100), clob_val clob); 
create type varchar_t as table of varchar2(100); 
create type clob_t as table of clob; 

以下查询正常工作:

select cast(collect(vc_val) as varchar_t) from t; 

而继失败,为什么?

select cast(collect(clob_val) as clob_t) from t; 

链接到这个例子http://sqlfiddle.com/#!4/b01e7/3

有人能解释我为什么第二次查询失败?

回答

3

它不起作用,因为CAST不支持LOB类型。

可以在Oracle的文档阅读一下:CAST Function In Oracle

SQLFiddle使用您的测试数据,CAST可以转换CLOBVARCHAR2

SELECT CAST(clob_val AS VARCHAR2(100)) FROM t; 

结果:

CAST(CLOB_VALASVARCHAR2(100)) 
----------------------------- 
clob1 
clob2

但我们不能这样做,CLOBs只是不支持:

SELECT CAST(vc_val AS CLOB) FROM t; 
> 00932. 00000 - "inconsistent datatypes: expected %s got %s"
3
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; 

希望有所帮助。

+0

你不能使用具有'CLOB'参数的'COLLECT',它会抛出'00932。 00000 - “不一致的数据类型:预期的%s得到%s”错误。至少它对我不起作用...... +1为'MULTISET'方法。 –

+0

@PrzemyslawKruglej谢谢你。我可以使用带有CLOB的COLLECT(从t中选择collect(clob_val)),但Oracle不喜欢带CLOB的CAST + COLLECT。不知道为什么说实话,但我有CAST + COLLECT的其他问题,所以我避免它,并使用multiset。 – tbone

+0

您正在使用哪个版本的Oracle?我有最新的11g版本之一...想知道为什么收集不适合我。 –