我需要选择几个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
有人可以解释为什么第二次查询失败了吗?
答案 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;
希望有所帮助。