我得到了一些幫助,並且被帶到this page和this 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。這使問題成爲現實問題。我更新了它,所以它是專注。
如果排除了,如果我= p_varchar2_tab.FIRST THEN l_string:!= l_string || p_delimiter; END IF;怎麼了? –
@FlorinGhita沒有變化..同樣的錯誤。理念? – filippo
@filippo:你的例子不再有效。如果'prodcode'列中的所有值具有相同的長度,則使用類型'CHAR'而不是'VARCHAR'。除此之外,你是否按照我昨天提出的方法試過'tab_to_string(CAST(COLLECT(prodcode)as t_varchar2_tab),',')'? (在Oracle 11g上,無論如何都可以工作。) – Codo