2012-11-08 34 views
5

Hiện nay tôi có các truy vấn sau đây:XMLAGG với RTRIM vấn đề

SELECT 
    CASE 
     WHEN ('[Param.3]' = 'SELECTED') 
      THEN (SELECT RTRIM(XMLELEMENT("Rowset", XMLAGG(RW.R ORDER BY RW."ID")), ' ') AS Orders 
       FROM TMTABLE UL, XMLTABLE('Rowsets/Rowset/Row' PASSING UL.TEXT COLUMNS "ID" NUMBER(19) PATH 'ID', R xmltype path '.') AS RW 
       WHERE ID BETWEEN '[Param.1]' and '[Param.2]') 
     WHEN ('[Param.3]' = 'ALL') 
      THEN (SELECT RTRIM(XMLELEMENT("Rowset", XMLAGG(RW.R ORDER BY RW."ID")) , ' ') AS Orders 
       FROM TMTABLE UL, XMLTABLE('Rowsets/Rowset/Row' PASSING UL.TEXT COLUMNS "ID" NUMBER(19) PATH 'ID', R xmltype path '.') AS RW) 
    END AS Orders 
FROM 
    dual 

Truy vấn này đang làm việc tốt nếu có số ít các dòng XML được sáp nhập vào hàng duy nhất với AGG XML. Nhưng nếu số lượng Hàng XML được hợp nhất cao hơn, truy vấn này sẽ ném lỗi sau:

ORA-19011: Character string buffer too small

Tôi cần áp dụng thay đổi gì để thực hiện công việc này?

Trả lời

12

Bạn cần thêm .getClobVal() vào kết quả XMLType của mình, trước RTRIM.

XMLAGG hoạt động tốt với lượng lớn dữ liệu. Và TRIM hoạt động tốt với CLOB. Nhưng khi bạn đặt chúng lại với nhau, Oracle sẽ cố gắng chuyển đổi XMLType thành VARCHAR2 thay vì một CLOB.

Ví dụ:

create or replace function test_function return clob is 
    v_clob clob; 
begin 
    v_clob := v_clob || lpad('a', 4000, 'a'); 
    v_clob := v_clob || lpad('b', 4000, 'b'); 
    return v_clob; 
end; 
/

--Works fine, returns an XMLType 
select xmlagg(xmlelement("asdf", test_function)) from dual; 

--Works fine, returns a CLOB 
select trim(test_function) from dual; 

--ORA-19011: Character string buffer too small 
select trim(xmlagg(xmlelement("asdf", test_function))) from dual; 

--Works 
select trim(xmlagg(xmlelement("asdf", test_function)).getClobVal()) from dual; 
+0

tôi đang cố gắng truy vấn sau đây: (. "RowSet", XMLAGG (RW.R ORDER BY RW "ID") getClobVal().) Chọn XMLELEMENT, '') AS Orders từ TMTABLE UL, XMLTABLE ('Rowsets/rowSet/Row' đi qua UL.TEXT COLUMNS "ID" NUMBER (19) pATH 'ID', R xmltype đường ) AS RW Nhưng nó mang lại cho tôi lỗi follwoing '': ORA-00.932: các kiểu dữ liệu không phù hợp: được mong đợi - có CHAR –

+0

@SohamShah Tôi nghĩ rằng bạn cần đặt '.getClobVal()' sau hàm XML cuối cùng, không chỉ là XMLAGG cuối cùng. Hãy thử: 'XMLELEMENT (" Rowset ", XMLAGG (RW.R ORDER BY RW." ID "), '') .getClobVal()'. –

1

Bạn cần phải thêm getClobVal() và cũng cần phải rtrim() vì nó sẽ trở delimiter trong phần cuối của kết quả.

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