首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Druid WallFilter 阻擋 Oracle 分頁 SQL:TOP 語法不支持需改用 ROWNUM

     編輯:程式設計綜合問答

錯誤信息

sql injection violation, syntax error: TODO : LITERAL_INT top
select top 20 * from (...) a where row_number > 0 order by row_number

Druid 解析器按 Oracle 方言檢測,發現 `SELECT TOP` 非法語法。

原因

**Oracle 無 `TOP` 關鍵字**,分頁需用 `ROWNUM` 或 `ROW_NUMBER()` 窗口函數。

修正 SQL

-- 方案一:ROWNUM 子查詢(通用)
SELECT * FROM (
    SELECT a.*, ROWNUM rn FROM (
        SELECT id, name, ... FROM wf_process WHERE state = ? ORDER BY name
    ) a WHERE ROWNUM <= 20
) WHERE rn > 0;

-- 方案二:ROW_NUMBER() 窗口函數(Oracle 12c+)
SELECT * FROM (
    SELECT t.*, ROW_NUMBER() OVER (ORDER BY name) rn
    FROM wf_process t WHERE state = ?
) WHERE rn BETWEEN 1 AND 20;

Druid 配置建議

  • 確認連接池 `druid.url` 正確識別 Oracle,WallFilter 才會用 Oracle 解析器。
  • 若必須跑通用 SQL,可關閉 WallFilter(不推薦)或添加白名單正則。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved