2011-09-26 32 views
3

我得到了一些幫助,並且被帶到this pagethis explanation,它應該包含聚合事物的有效方法。在Oracle 10g上創建聚合函數返回無用的錯誤

它建議使用de COLLECT函數和其他一些自定義的東西。我想與它相處,但錯誤消息(加上我的新手)並不是最有用的。

功能:

CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(4000); 

CREATE OR REPLACE FUNCTION tab_to_string (
    p_varchar2_tab IN t_varchar2_tab, 
    p_delimiter  IN VARCHAR2 DEFAULT ',') 
RETURN VARCHAR2 IS 
    l_string  VARCHAR2(32767); 
BEGIN 
    FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP 
    IF i != p_varchar2_tab.FIRST THEN 
     l_string := l_string || p_delimiter; 
    END IF; 
    l_string := l_string || p_varchar2_tab(i); 
    END LOOP; 
    RETURN l_string; 
END tab_to_string; 

而且我的測試:

with my_table as 
(
    select 'user1' as usrid, 'ab' as prodcode from dual union 
    select 'user1' as usrid, 'bb' as prodcode from dual union 
    select 'user1' as usrid, 'a' as prodcode from dual union 
    select 'user2' as usrid, 'db' as prodcode from dual union 
    select 'user2' as usrid, 'b' as prodcode from dual union 
    select 'user2' as usrid, 'bfdd' as prodcode from dual 
) 
select 
    usrid, 
    tab_to_string(CAST(COLLECT(prodcode) AS t_varchar2_tab)) AS codes 
from 
    my_table 
group by 
    usrid 

能給我一個ORA-06553: PLS-306: wrong number or types of arguments in call to 'TAB_TO_STRING'

這是非常複製和過去從我在註明出處開始,這個功能對我來說很有意義..我錯過了什麼?

謝謝!

[編輯]科多已計算過的問題之一是甲骨文理解'a'作爲,而不是VARCHAR。這使問題成爲現實問題。我更新了它,所以它是專注。

+0

如果排除了,如果我= p_varchar2_tab.FIRST THEN l_string:!= l_string || p_delimiter; END IF;怎麼了? –

+0

@FlorinGhita沒有變化..同樣的錯誤。理念? – filippo

+0

@filippo:你的例子不再有效。如果'prodcode'列中的所有值具有相同的長度,則使用類型'CHAR'而不是'VARCHAR'。除此之外,你是否按照我昨天提出的方法試過'tab_to_string(CAST(COLLECT(prodcode)as t_varchar2_tab),',')'? (在Oracle 11g上,無論如何都可以工作。) – Codo

回答

2

由於我不太明白的原因,Oracle認爲合成表的PRODCODE列不是VARCHAR2列。如果你稍微修改PRODCODE值中的一個,它會工作:

with my_table as 
(
    select 'user1' as usrid, 'ab' as prodcode from dual union 
    select 'user1' as usrid, 'b' as prodcode from dual union 
    select 'user1' as usrid, 'c' as prodcode from dual union 
    select 'user2' as usrid, 'd' as prodcode from dual union 
    select 'user2' as usrid, 'e' as prodcode from dual union 
    select 'user2' as usrid, 'f' as prodcode from dual 
) 
select 
    usrid, 
    tab_to_string(CAST(COLLECT(prodcode) AS t_varchar2_tab)) AS codes 
from 
    my_table 
group by 
    usrid 
+1

我懷疑''a''屬於'CHAR'型 – Benoit

+0

Phew,這是超級跛腳,但做了詭計。不,我得到的錯誤是「PLS-306:錯誤的參數數量或類型」。關於這個的想法? – filippo

+0

在Oracle 11g上,如果我將'a'更改爲'ab',它將無需進一步更改。我只能猜測:可能你已經在10g中明確指定了第二個參數'p_delimiter'。 – Codo