網上搜索這類錯誤還是挺多的,只提供我遇到的一種情景。
本地數據庫環境:Oracle10g
導入別人的項目后,有一段SQL查詢總是報如下錯誤信息:
Cause: java.sql.SQLException: ORA-00923: 未找到要求的 FROM 關鍵字
定位到該段SQL后直接通過工具運行報同樣的錯誤,SQL如下:
SELECT
t.depart_id,
listagg (t.user_name, ',') WITHIN GROUP (ORDER BY t.user_name) user_name
FROM
depart_user_relation t
WHERE
t.depart_id = '20'
GROUP BY
t.depart_id
錯誤信息如下:
ORA-00923: FROM keyword not found where expected
原因:listagg within 為 Oracle11g 后引入的,在 Oracle10g 中不支持。
解決方案:
1、升級到Oracle11
2、尋求替代方案
首先在尋求替代方案之前要了解該函數的作用。
該函數可以實現按條件實現列轉行。 第二個參數可以靈活的選擇 “ ,| - ” 等符號。
我上邊那個 SQL 就是想通過 depart_id 進行分組,然后把 user_name 進行列轉行。

上實圖,左側即數據庫原始數據,右側為使用 listagg 函數后的效果。
WM_CONCAT函數介紹
wm_concat 函數也可以用作字符串拼接,也是一種聚合函數,也可以用作分析函數,只是函數本身不能像 listagg 那樣自由選擇間隔字符,固定使用逗號分隔,但可以用其他函數(例如REPLACE)來實現分隔符的改變。唯一無法實現的是,不能自由選擇排序的依據,也就是 listagg 中必須使用的 order by 子句。
WM_CONCAT用法示例
select depart_id,wm_concat(user_name)
from depart_user_relation
group by depart_id;
由於固定的使用逗號分隔符,所以,如果想替換的話可以使用 REPLACE 函數,具體使用如下:
select depart_id, REPLACE(wm_concat(user_name),',','|')
from depart_user_relation
group by depart_id;
這樣就實現了 ,號轉 | 了,當然 | 還可以為其他字符。
最后:盡管采用 wm_concat 函數替代了11g新加入的 listagg 函數,但是 wm_concat 函數並不能實現組內排序的短板,若無分組排序要求的話,兩者是可以通用。