Oracle游标的概念
时间: 2025-01-02 11:17:48 浏览: 6
### Oracle 游标的定义
游标是在内存中的特定区域,用于存放 `SELECT` 语句的结果集。它允许程序逐个处理和遍历由查询返回的记录集合[^3]。
#### 显式游标
显式游标需要在 PL/SQL 中显式声明、打开、读取数据并最终关闭。以下是显式游标的生命周期:
- **声明**:指定游标名称及其关联的选择列表。
- **打开**:执行与游标准备阶段相关联的 SQL 查询。
- **获取(Fetch)**:从当前行提取数据到变量中;每次调用 fetch 都会移动指针至下一行直到结束。
- **关闭**:释放资源并将游标标记为已关闭状态。
```sql
DECLARE
CURSOR emp_cursor IS SELECT * FROM employees;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO v_emp_rec;
EXIT WHEN emp_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_emp_rec.employee_id || ' - ' ||
v_emp_rec.first_name);
END LOOP;
CLOSE emp_cursor;
END;
```
此代码片段展示了一个完整的显式游标操作过程,在这里选择了员工表的所有列,并打印了每位雇员的名字与其ID号[^1]。
#### 隐式游标
当执行 DML (`INSERT`, `UPDATE`, 或者 `DELETE`) 和某些类型的查询时,Oracle 自动创建隐式游标来管理这些命令的结果。虽然不需要手动控制它们的行为,但是可以通过访问几个预定义好的属性来获得有关最近完成的操作的信息,比如受影响的行数等[^2]。
例如,要显示最后一条更新语句影响了多少行,可以这样做:
```plsql
BEGIN
UPDATE employees SET salary = salary + 100 WHERE department_id = 90;
IF SQL%ROWCOUNT > 0 THEN
DBMS_OUTPUT.PUT_LINE('Updated rows: ' || TO_CHAR(SQL%ROWCOUNT));
ELSE
DBMS_OUTPUT.PUT_LINE('No records were updated.');
END IF;
END;
```
这段脚本尝试给部门编号为90的所有成员增加工资,并报告实际修改了几条记录。
阅读全文