我遇到了Oracle 10g的问题以及COLLECT
函数的使用问题。我今天早上才发现它存在,但有一个问题可以通过与member of
条件相关联来解决。
最初,我编写了下面显示的代码,其中返回错误“ORA_00932:不一致的数据类型:预期的UDT得到了 - ”。
with my_tab as (
select 1 as cola, 1 as colb from dual union all
select 1 as cola, 2 as colb from dual union all
select 2 as cola, 3 as colb from dual union all
select 2 as cola, 4 as colb from dual union all
select 3 as cola, 3 as colb from dual union all
select 3 as cola, 4 as colb from dual union all
select 4 as cola, 1 as colb from dual union all
select 4 as cola, 2 as colb from dual
)
select
cola,
colb_vals
from (
select
cola,
collect(colb) as colb_vals
from my_tab
group by cola
)
where 2 member of colb_vals
我发现这有点奇怪,因为在Oracle 10.2.4.0中,似乎数据库将创建一个临时系统生成的用户定义类型,并使用它。如果删除条件(where 2 member of colb_vals
),则代码将运行并显示检索到的数据包括临时UDT(名为SYSTPblahblahblah ==)。
经过一番搜索后,我意识到我可以使用CREATE TYPE
来解决这个问题,然后使用CAST
函数来更改嵌套表的类型。哪个有效。
这是使用CREATE TYPE number_ntt as TABLE OF NUMBER;
并将collect(colb)
替换为cast(collect(colb) as number_ntt)
然后我尝试使用在包中创建的嵌套表类型,因为我只需要在单个包中的一个过程中为一个特定查询提供此类型。我无法让它发挥作用。
create or replace package mike_temp_pkg as
type number_ntt is table of number;
end mike_temp_pkg;
这次用collect(colb)
替换cast(collect(colb) as mike_temp_pkg.number_ntt)
这导致ORA-00932:数据类型无效。
所以我的问题实际上分为两部分:
为什么系统会生成用户
为select
定义的类型工作
但不适用于member of
?
为什么类型需要是SQL 类型而不是PL / SQL类型 包?我没有真正定义类型 通常这样可能会有一个 对这个问题的简单回答。
答案 0 :(得分:2)
(1)
COLLECT函数文档说明“要获得此函数的结果,必须在CAST函数中使用它。”我怀疑它只是不支持任何用途,除了简单转储其内容,除非你把它转换为定义的类型。
(2)
SQL解析器不了解或访问PL / SQL块中定义的类型。即使在PL / SQL代码中执行SQL语句,该语句也基本上被移交给独立的解析器(PL / SQL变量名称被绑定变量占位符替换)。