首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

Oracle 與 Sybase 分頁查詢語法對比:ROWNUM vs SET ROWCOUNT

     編輯:Oracle 教學

Oracle 與 Sybase 分頁查詢語法對比:ROWNUM vs SET ROWCOUNT

分批處理大量資料是常見需求。Oracle 使用 ROWNUM 偽欄位,Sybase (ASE/SQL Anywhere) 使用 SET ROWCOUNT 會話層級設定。本文以相同測試表 TB_EMPLOYEEINFO 對比兩者語法、行為差異與注意事項。

測試表與資料

-- Oracle
CREATE TABLE TB_EMPLOYEEINFO (
  EMPLOYENO VARCHAR2(20) NOT NULL,
  EMPLOYENAME VARCHAR2(20) NOT NULL,
  EMPLOYEEAGE INT NOT NULL
);
INSERT INTO TB_EMPLOYEEINFO VALUES ('A1000','ZhangSan',20);
INSERT INTO TB_EMPLOYEEINFO VALUES ('A1001','LiSi',21);
INSERT INTO TB_EMPLOYEEINFO VALUES ('A1002','WangWu',21);
INSERT INTO TB_EMPLOYEEINFO VALUES ('A1003','ZhouLiu',22);
INSERT INTO TB_EMPLOYEEINFO VALUES ('A1004','SunQi',22);
INSERT INTO TB_EMPLOYEEINFO VALUES ('A1005','LiuBa',23);
INSERT INTO TB_EMPLOYEEINFO VALUES ('A1006','ChenShi',25);

-- Sybase
CREATE TABLE TB_EMPLOYEEINFO (
  EMPLOYENO VARCHAR(20) NOT NULL,
  EMPLOYENAME VARCHAR(20) NOT NULL,
  EMPLOYEEAGE INT NOT NULL
);
-- 相同 INSERT 語句

Oracle:ROWNUM 限制回傳筆數

SET ROWCOUNT 5;
SELECT EMPLOYENO, EMPLOYENAME, EMPLOYEEAGE FROM TB_EMPLOYEEINFO;
SET ROWCOUNT 0;  -- 必須歸零,否則後續所有查詢受限
  • SET ROWCOUNT N 影響當前會話所有後續 SELECT/INSERT/UPDATE/DELETE
  • 必須配對 SET ROWCOUNT 0 恢復預設,否則後續查詢永久限制 5 筆
  • 不支援 OFFSET/FETCH(視版本而定)

關鍵差異對照

特性Oracle ROWNUMSybase SET ROWCOUNT
作用範圍單一查詢整個會話
分頁支援需子查詢包裝 / 12c+ OFFSET需搭配游標或暫存表
重置方式自動(每查詢重新計算)手動 SET ROWCOUNT 0
效能優化器可推導 Stopkey全表掃描後截斷

最佳實踐

  1. Oracle:12c+ 直接用 OFFSET/FETCH;11g 使用 ROWNUM 子查詢包裝模式
  2. Sybase:SET ROWCOUNT 僅用於簡單「取前 N 筆」腳本,複雜分頁改用應用層游標或 ROW_NUMBER() OVER(支援版本)
  3. 兩者皆不保證順序,務必加 ORDER BY 確保結果確定性

理解兩種資料庫的限流機制差異,能寫出可移植、行為可預期的分批處理邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved