1. 程式人生 > >除錯經驗——Oracle函式Listagg不能用與Oracle版本低有關

除錯經驗——Oracle函式Listagg不能用與Oracle版本低有關

問題描述:

這兩天在排查一段生產query不能正常run的原因。一開始懷疑是query中LISTAGG函式的語法有錯誤。經過一番排查,才發現是Oracle版本太低的原因。

 

排查方法:

在支援LISTAGG函式的資料庫中,下面這段測試程式碼是可以輸出結果的。

/* Formatted on 10/18/2018 3:28:09 PM (QP5 v5.215.12089.38647) */
WITH TEMP
     AS (SELECT 500 POPULATION, 'China' NATION, 'Guangzhou' CITY FROM DUAL
         UNION ALL
         SELECT 1500 POPULATION, 'China' NATION, 'Shanghai' CITY FROM DUAL
         UNION ALL
         SELECT 500 POPULATION, 'China' NATION, 'Beijing' CITY FROM DUAL
         UNION ALL
         SELECT 1000 POPULATION, 'USA' NATION, 'New York' CITY FROM DUAL
         UNION ALL
         SELECT 500 POPULATION, 'USA' NATION, 'Bostom' CITY FROM DUAL
         UNION ALL
         SELECT 500 POPULATION, 'Japan' NATION, 'Tokyo' CITY FROM DUAL)
SELECT POPULATION,
       NATION,
       CITY,
       LISTAGG (CITY, ',')
          WITHIN GROUP (ORDER BY CITY)
          OVER (PARTITION BY NATION)
          RANK
  FROM TEMP

結果為:

但是,在Oracle 11.1中,上述query不能成功執行,而是會丟擲以下錯誤:

ORA-00923: FROM keyword not found where expected

很明顯,這個error description並不直接,導致問題的排查花費了很多時間!怒了!

 

結論:

LISTAGG函式只在Oracle 11.2以後的版本中才有,11.1 中並不支援。