2014-01-05 55 views
2
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

+0

你爲什麼不乾脆選擇到行TEST_TABLE%ROWTYPE;並返回row.cars_list.COUNT而不是做選擇? – hmmftg

回答

5

不,你不能在這種情況下使用count方法。您手邊有SQL嵌套表,count方法僅用於PL/SQL集合。

要計算嵌套表的元素數量,你可以UNNEST該嵌套表或使用標量子查詢:

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

我無法解釋爲什麼這不起作用,但這是:

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

Oracle期望在其選擇列表中使用列名或函數,但是您所提供的是集合構建方法,該方法僅對集合進行操作。

可以達到同樣的使用標量子查詢

SELECT (select count(1) from table(cars_list)) as "COUNT" 
FROM test_table 
WHERE id = 1; 
2

使用

Select 
    Cardinality(cars_list) from test_table