在clobs上收集功能

时间:2013-11-21 15:12:31

标签: sql oracle oracle11g

我需要选择几个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

有人可以解释为什么第二次查询失败了吗?

2 个答案:

答案 0 :(得分:3)

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

您可以在Oracle的文档中了解这一点:CAST Function In Oracle

使用SQLFiddle中的测试数据,CAST可以将CLOB转换为VARCHAR2

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"

答案 1 :(得分: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   值为RAW数据类型,数据库隐式转换LOB   值到字符或原始数据,然后显式转换结果   值到目标数据类型。如果结果值大于   目标类型,然后数据库返回错误。

这似乎是指从CLOB转换 - &gt; VARCHAR。但是如果你已经拥有Clobs,你应该能够将它们放入一个集合(在这种情况下是一个嵌套表)。

我通常使用CAST + MULTISET而不是COLLECT,我认为它更容易,也不那么挑剔。我认为你的问题在于COLLECT + CAST,而不是CAST本身(与NUMBER精度类似的问题)。

编辑: 我删除了使用Collect函数的任何建议,虽然我可以在一个简单的选择中使用它而没有错误,我无法在pl / sql中使用它。另外,除了上面的CAST + MULTISET选项(SQL或pl / sql)之外,您还可以(无论如何在pl / sql中)执行:

select clob_col
bulk collect into l_clob_tab
from t;

希望有所帮助。