2016-09-05 21 views
0

(使用Oracle 11.2)獲取ORA-22922(不存在LOB值)或者沒有結果與wm_concat在所有的()

我有類似

wm_concat(distinct abc) 

一個相當複雜的SQL,預計到返回一些varchar2(4000)兼容結果

它導致ORA-00932: inconsistent datatypes在我選擇的某些coalesce(some_varchar_col, wm_concat(...))中使用。


所以我試圖通過兩種不同的方法鑄造它:

dbms_lob.substr(..., 4000) -- L) tried even with 3000 in case of "unicode byte blow-up" 
cast(... as varchar2(4000)) -- C) tried even with 3000 in case of "unicode byte blow-up" 

(將在視圖中使用,但玩弄它表明,它是不相關的意見)

取決於柱等運營商我要麼得到N)無結果或O)ORA-22922

select * from view_with_above_included where rownum <= 100 
  • N)我的Eclipse數據瀏覽器JDBC連接返回沒有任何結果(無結果沒有列,沒有(0 rows effected),只有查詢時間統計)。 (?它可以是一個內部異常不作這樣的處理)

  • O)

    ORA-22922: nonexistent LOB value 
    ORA-06512: in "SYS.DBMS_LOB", line 1092 
    ORA-06512: in line 1 
    

奇怪以下測試查詢工作:

-- rownum <= 100 would already cause the above problems 
select * from view_with_above_included where rownum <= 10 

select * from view_with_above_included 

但是查看實際的聚合數據不會顯示聚合的數據,其長度將超過1000個字符。

+0

這可能與:http://stackoverflow.com/questions/12969274,https://community.oracle.com/thread/2383469 –

回答

1

幸運的是,它的工作原理與自11.2(我們正在運行)提供的listagg(...)功能,所以我們沒有進一步調查:

listagg(abc, ',') within group (order by abc) 

(其中wm_concat(...)是,作爲一個人應該知道,一些內部和官方不支持的功能。)


一個rather nice solution(因爲它不是那麼臃腫)實施distinct功能是通過自引用的正則表達式的功能應該在很多情況下工作:

regexp_replace( 
    listagg(abc, ',') within group (order by abc) 
, '(^|,)(.+)(,\2)+', '\1\2') 

(也許/希望未來我們會看到一些可以工作的功能listagg(distinct abc),這個功能將會非常簡潔並且很酷,就像wm_concat的語法一樣。例如,這對Postgres'很長時間來說並不是問題)

-- 1: postgres sql example: 
select string_agg(distinct x, ',') from unnest('{a,b,a}'::text[]) as x` 

如果列表超過4000個字符,一個不能使用listaggORA-22922再次)。 但幸運的是我們可以在這裏使用xmlagg函數(如提到的here)。 如果你想實現distinct在4000字符截斷的結果在這裏,你可以註釋(1) - 標記行

-- in smallercase everything that could/should be special for your query 
-- comment in (1) to realize a distinct on a 4000 chars truncated result 
WITH cfg AS ( 
    SELECT 
    ','     AS list_delim, 
    '([^,]+)(,\1)*(,|$)' AS list_dist_match, -- regexp match for distinct functionality 
    '\1\3'    AS LIST_DIST_REPL -- regexp replace for distinct functionality 
    FROM DUAL 
) 
SELECT 
    --REGEXP_REPLACE(DBMS_LOB.SUBSTR(   -- (1) 
    RTRIM(XMLAGG(XMLELEMENT(E, mycol, listdelim).EXTRACT('//text()') 
    ORDER BY mycol).GetClobVal(), LIST_DELIM) 
    --, 4000), LIST_DIST_MATCH, LIST_DIST_REPL) -- (1) 
    AS mylist 
FROM mytab, CFG 
+0

的**'distinct'但必須處理不同* *,例如:http://stackoverflow.com/a/11511203/1915920 –

+0

wm_concat反正在Oracle11g中不受支持。它直到Oracle 10g纔可用。 – XING

+0

@Raj_Te:錯誤...在Oracle 12c中被移除(在11.2中工作),可用,但在不存在的情況下不受支持。 –