分批處理大量資料是常見需求。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 語句
SET ROWCOUNT 5; SELECT EMPLOYENO, EMPLOYENAME, EMPLOYEEAGE FROM TB_EMPLOYEEINFO; SET ROWCOUNT 0; -- 必須歸零,否則後續所有查詢受限
SET ROWCOUNT N 影響當前會話所有後續 SELECT/INSERT/UPDATE/DELETESET ROWCOUNT 0 恢復預設,否則後續查詢永久限制 5 筆OFFSET/FETCH(視版本而定)| 特性 | Oracle ROWNUM | Sybase SET ROWCOUNT |
|---|---|---|
| 作用範圍 | 單一查詢 | 整個會話 |
| 分頁支援 | 需子查詢包裝 / 12c+ OFFSET | 需搭配游標或暫存表 |
| 重置方式 | 自動(每查詢重新計算) | 手動 SET ROWCOUNT 0 |
| 效能 | 優化器可推導 Stopkey | 全表掃描後截斷 |
OFFSET/FETCH;11g 使用 ROWNUM 子查詢包裝模式SET ROWCOUNT 僅用於簡單「取前 N 筆」腳本,複雜分頁改用應用層游標或 ROW_NUMBER() OVER(支援版本)ORDER BY 確保結果確定性理解兩種資料庫的限流機制差異,能寫出可移植、行為可預期的分批處理邏輯。