2012-02-23 22 views
13

listagg là một chức năng được giới thiệu trong Oracle 11.2! hiện chức năng này được bugging chúng tôi phân phối, chúng tôi đang chuyển từ MySQL sang Oracle và chúng tôi có truy vấn này:thay thế cho listagg trong Oracle?

SELECT 
    p_id, 
    MAX(registered) AS registered, 
    listagg(MESSAGE, ' ') within GROUP (ORDER BY registered) AS MESSAGE 
    FROM 
    umm_parent_id_remarks_v m 
    GROUP BY 
    m.p_id; 

là hoạt động tốt trong MySQL như xa như chúng ta biết gì bugging chúng tôi đang được Oracle nó trả VARCAR và không CLOB như chúng ta cần! văn bản rất lớn và chúng tôi cần nó là CLOB!

đây là những gì tôi đã cố gắng làm!

tạo bảng CLOB_T loại CLOB!

sau đó tạo ra các chức năng

create or replace 
function listaggclob (t in clob_t) 
    return clob 
as 
    ret clob := ''; 
    i number; 
begin 
    i := t.first; 
    while i is not null loop 
    if ret is not null then 
     ret := ret || ' '; 
    end if; 
    ret := ret || t(i); 
    i := t.next(i); 
    end loop; 
    return ret; 
end; 

bây giờ nếu tôi chạy nó:

SELECT 
     p_id, 
     MAX(registered) AS registered, 
     listaggclob(cast(collect (MESSAGE) as clob_t)) MESSAGE 
     FROM 
     umm_parent_id_remarks_v m 
     GROUP BY 
     m.p_id; 

tôi nhận được

ORA-22.814: attribute hoặc giá trị phần tử lớn hơn quy định tại loại

có giải pháp nào cho nó không?

nhờ bạn

Trả lời

14
+1

+1 cảm ơn cho liên kết thu thập! – tbone

+0

Tôi đã viết chức năng của riêng mình và tôi đã cập nhật câu hỏi của mình, vui lòng xem lại câu hỏi của tôi một lần nữa, cảm ơn –

+0

Tôi không biết tại sao bạn lại gặp phải lỗi đó - có lẽ bạn nên đăng câu hỏi đó làm câu hỏi mới, bạn sẽ nhận được nhiều người hơn nhìn nó theo cách đó. –

2

Bạn có thể muốn xem user-defined aggregate functions.

Kỹ thuật tổng hợp chuỗi khác nhau được hiển thị here. Chúng bao gồm một ví dụ cho các hàm tổng hợp do người dùng định nghĩa.

+0

Tập hợp các tùy chọn tốt ở đó. Có thông tin nào nhanh hơn không? –

+0

Tôi không có bất kỳ thông tin nào về hiệu suất. Tôi đoán nó chủ yếu phụ thuộc vào kế hoạch thực hiện tổng thể và cách chúng phù hợp với kế hoạch thực hiện đó. Vì vậy, nó có thể khác với truy vấn để truy vấn. – Codo

2

Bạn có thể giải quyết các lỗi ORA-22814 bằng cách sử dụng MULTISET thay vì COLLECT:

SELECT 
    p_id, 
    MAX(registered) AS registered, 
    listaggclob(cast(multiset(
     select MESSAGE 
     from umm_parent_id_remarks_v 
     where umm_parent_id_remarks_v.p_id = m.p_id 
    ) as clob_t)) MESSAGE 
    FROM 
    umm_parent_id_remarks_v m 
    GROUP BY 
    m.p_id; 
2

WM_CONCAT làm việc cho tôi.

SELECT replace(WMSYS.WM_CONCAT(myTable.name), ',', ';') 
FROM myTable 
GROUP BY myTable.id 

Tôi đã bọc nó bằng "thay thế" để chỉ định dấu phân tách mục khác nhau (';') từ dấu phân tách được sử dụng bởi WM_CONCAT (',').

+2

Lưu ý rằng WM_CONCAT không có sẵn trong 12c, Express Edition và bất kỳ cơ sở dữ liệu nào mà Workspace Manager chưa được cài đặt. –

+1

nó không được hỗ trợ và cũng không được ghi chép ngày nay –

1

Sử dụng xmlAgg, ví dụ được trình bày dưới đây:

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',') AS LIST 
FROM tablename; 

này sẽ trở lại giá trị clob và do đó không cần phải tạo ra chức năng tùy chỉnh.

0

- Tạo Clobe Loại - CREATE OR REPLACE TYPE "MSCONCATIMPL_CLOB" AS OBJECT ( resultstring CLOB, delimiter VARCHAR2 (10),

STATIC FUNCTION odciaggregateinitialize (io_srccontext IN OUT msconcatimpl_clob) RETURN NUMBER, 

MEMBER FUNCTION odciaggregateiterate (
    self IN OUT msconcatimpl_clob, 
    value IN CLOB 
) RETURN NUMBER, 

MEMBER FUNCTION odciaggregateterminate (
    self   IN msconcatimpl_clob, 
    o_returnvalue OUT CLOB, 
    i_flags   IN NUMBER 
) RETURN NUMBER, 

MEMBER FUNCTION odciaggregatemerge (
    self IN OUT msconcatimpl_clob, 
    i_ctx2 IN msconcatimpl_clob 
) RETURN NUMBER 

); / - Tạo Clobe Loại Body -

CREATE OR REPLACE LOẠI BODY "MSCONCATIMPL_CLOB" LÀ TĨNH CHỨC NĂNG odciaggregateinitialize (io_srccontext IN OUT msconcatimpl_clob) RETURN SỐ IS BEGIN io_srccontext: = msconcatimpl_clob ( NULL, NULL ); io_srccontext.delimiter: = ''; RETURN odciconst.success; END odciaggregateinitialize;

MEMBER FUNCTION odciaggregateiterate (
    self IN OUT msconcatimpl_clob, 
    value IN CLOB 
) RETURN NUMBER 
    IS 
BEGIN 
    IF 
     value IS NOT NULL 
    THEN 
     IF 
      self.resultstring IS NULL 
     THEN 
      self.resultstring := self.resultstring || value; 
     ELSE 
      self.resultstring := self.resultstring 
      || self.delimiter 
      || value; 
     END IF; 
    END IF; 

    RETURN odciconst.success; 
END odciaggregateiterate; 

MEMBER FUNCTION odciaggregateterminate (
    self   IN msconcatimpl_clob, 
    o_returnvalue OUT CLOB, 
    i_flags   IN NUMBER 
) RETURN NUMBER 
    IS 
BEGIN 
    o_returnvalue := self.resultstring; 
    RETURN odciconst.success; 
END odciaggregateterminate; 

MEMBER FUNCTION odciaggregatemerge (
    self IN OUT msconcatimpl_clob, 
    i_ctx2 IN msconcatimpl_clob 
) RETURN NUMBER 
    IS 
BEGIN 
    IF 
      self.resultstring IS NULL 
     AND 
      i_ctx2.resultstring IS NOT NULL 
    THEN 
     self.resultstring := i_ctx2.resultstring; 
    ELSIF 
     self.resultstring IS NOT NULL 
    AND 
     i_ctx2.resultstring IS NOT NULL 
    THEN 
     self.resultstring := self.resultstring 
     || self.delimiter 
     || i_ctx2.resultstring; 
    END IF; 

    RETURN odciconst.success; 
END odciaggregatemerge; 

END; /

- Tạo Clobe Chức năng -

CREATE OR REPLACE CHỨC NĂNG ms_concat_clob (đầu vào VARCHAR2) RETURN CLOB PARALLEL_ENABLE GỘP SỬ DỤNG msconcatimpl_clob; /