MySQL 5.0.2+ 透過 C API mysql_stmt_attr_set() 實作服務端游標,允許在伺服器端產生結果集,客戶端按需抓取,減少網路傳輸。
| 限制項目 | 說明 | 影響 |
|---|---|---|
| 唯讀 | 不可透過游標更新/刪除資料 | 無 UPDATE WHERE CURRENT OF、DELETE WHERE CURRENT OF |
| 非保持 | Commit 後自動關閉 | 跨事務不可重用,需重新 OPEN |
| 不敏感 | 結果集為開啟時快照,後續資料變更不可見 | 類似 INSENSITIVE,避免幻讀但可能過期 |
| 不可捲動 | 僅支援 FETCH NEXT,無 PRIOR/FIRST/LAST/ABSOLUTE/RELATIVE | 無法反向/隨機存取,僅適合單向流式處理 |
| 未命名 | 以 Statement Handler 當作游標 ID | 無法透過名稱管理,API 層面較簡潔 |
| 每預處理語句僅 1 個游標 | 需多游標時必須準備多條 Statement | 增加 Client 端資源佔用 |
| 不支援的語句類型 | CHECK TABLE、HANDLER READ、SHOW BINLOG EVENTS 等 | 僅支援可產生結果集的預處理 SELECT |
MYSQL_STMT *stmt = mysql_stmt_init(mysql);
mysql_stmt_prepare(stmt, "SELECT id, data FROM big_table WHERE id > ?", strlen(...));
mysql_stmt_bind_param(stmt, &bind_param);
mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*)CURSOR_TYPE_READ_ONLY);
mysql_stmt_execute(stmt);
mysql_stmt_bind_result(stmt, &bind_result);
while (mysql_stmt_fetch(stmt) == 0) {
// 處理單行
}
mysql_stmt_close(stmt);
MySQL 8.0 仍保持相同限制;若需可捲動/可更新游標,建議在應用層實作或評估 PostgreSQL/Oracle 等支援完整 SQL:2003 游標規範的資料庫。