Oracle COLLECT功能和类型

时间:2010-11-24 15:57:58

标签: oracle oracle10g ora-00932

我遇到了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:数据类型无效。

所以我的问题实际上分为两部分:

  1. 为什么系统会生成用户 为select定义的类型工作 但不适用于member of

  2. 为什么类型需要是SQL 类型而不是PL / SQL类型 包?我没有真正定义类型 通常这样可能会有一个 对这个问题的简单回答。

1 个答案:

答案 0 :(得分:2)

(1)

COLLECT函数文档说明“要获得此函数的结果,必须在CAST函数中使用它。”我怀疑它只是不支持任何用途,除了简单转储其内容,除非你把它转换为定义的类型。

(2)

SQL解析器不了解或访问PL / SQL块中定义的类型。即使在PL / SQL代码中执行SQL语句,该语句也基本上被移交给独立的解析器(PL / SQL变量名称被绑定变量占位符替换)。