正确使用收集方法

时间:2014-01-05 13:50:06

标签: oracle plsql oracle11g user-defined-types

CREATE  OR  REPLACE  TYPE  nvarchar2_list_type AS TABLE OF NVARCHAR2(100);


CREATE   TABLE test_table(
   id number primary key,
   cars_list     nvarchar2_list_type 
)
NESTED TABLE cars_list  STORE AS cars_list_storage_table;


insert into test_table(id, cars_list)
    values(1,  nvarchar2_list_type( 'AUDI', 'MERCEDES')  );

以上所有操作都成功完成,表test_table中插入了1行,现在我写了这个函数:

create or replace function get_cnt 
return number
as
  ret_val number;
begin
  SELECT  cars_list.COUNT    
    INTO  ret_val
   from test_table where id  = 1;

   return ret_val;
end;

这会出错:ORA-00904: "CARS_LIST"."COUNT": invalid identifier

请告诉我这里有什么问题?

据我所知,必须使用COUNT方法(from here

4 个答案:

答案 0 :(得分:5)

不,在这种情况下你不能使用count方法。您有SQL嵌套表,count方法仅用于PL / SQL集合。

要计算嵌套表元素的数量,您可以取消嵌套表或使用标量子查询:

Unnesting:

SQL> select id
  2       , count(*) as cnt
  3     from test_table t
  4     cross join table(t.cars_list)
  5    group by id
  6  ;

        ID        CNT
---------- ----------
         1          2

标量子查询:

SQL> select id
  2       , (select count(column_value)
  3            from table(t.cars_list)) as cnt
  4     from test_table t
  5  ;
        ID        CNT
---------- ----------
         1          2

答案 1 :(得分:2)

使用

  Select
  Cardinality(cars_list) from test_table

答案 2 :(得分:1)

我无法解释为什么这不起作用,但确实如此:

select (select count(*) from table(cars_list))
into ret_val
from test_table
where id  = 1;

答案 3 :(得分:1)

Oracle期望在其选择列表中使用列名或函数,但您所提供的是仅在集合上运行的方法中的集合构建。

您可以使用标量子查询

来实现相同的目标
SELECT (select count(1) from table(cars_list)) as "COUNT" 
FROM test_table 
WHERE id = 1;