存储过程-cursor

-----存储过程游标使用篇-----
-- 1.隐式游标 : 隐式Cursor是系统自动打开和关闭Cursor.
--SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数
--SQL%FOUND  布尔型  值为TRUE代表插入、删除、更新或单行查询操作成功
--SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反
--SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假
begin
  update student set s_name = 'modify' where s_id = 4; 
  if(sql%found) then
    Dbms_Output.put_line('find the rowdata 。。。');
    commit;
    else
    Dbms_Output.put_line('unfind the rowdata 。。。');
    rollback;
  end if;
end;
-- 2.显示游标
declare
  cursor cur is select * from student;
  cursor cur2 is select * from student;
  stuRow student%rowtype;
begin
  for stu in cur loop
    --stuRow := stu;
    Dbms_Output.put_line(stu.s_name);
  end loop;
 
  open cur2;
  loop
    Fetch cur2 into stuRow;
    Exit when cur2%notfound;
    Dbms_Output.put_line(stuRow.s_name);
  end loop;
  Dbms_Output.put_line(cur2%ROWCOUNT);
  if(cur2%isopen) then
    Dbms_Output.put_line('-close cur2-');
    close cur2;
  end if;
end;
-- 3.动态游标
declare
  type cursor_type is ref cursor;
  cur cursor_type;
  sqlStr varchar2(40);
  rowData student%rowtype;
begin
  sqlStr := 'select * from student';
  open cur for sqlStr;
  loop
    fetch cur into rowData;
    if(cur%notfound) then
      exit;
      Dbms_Output.put_line('-not find ...-');
    end if;
    Dbms_Output.put_line('-data-'||rowData.s_name);
  end loop;
  if(cur%isopen) then
   close cur;
  end if;
end;
### 使用 `OPEN WITH CURSOR` 的含义与方法 在编程和数据库操作中,游标Cursor)是一种用于遍历查询结果集的数据结构。通过游标可以逐行处理数据,而不是一次性加载整个结果集到内存中。这种方特别适合于大数据量的场景。 #### 游标的定义与作用 游标允许开发者逐步访问查询的结果集中的每一行记录。它通常被用来执行复杂的逻辑操作,比如更新或删除特定条件下的多条记录[^1]。 #### 在 Python 中使用游标 Python 数据库接口标准 (DB-API 2.0) 定义了一种通用的方来连接各种类型的数据库并操作它们。以下是基于 SQLite 和 PostgreSQL 的两个例子: ##### 示例 1: 使用 SQLite 进行游标操作 ```python import sqlite3 connection = sqlite3.connect('example.db') cursor = connection.cursor() # 创建表并插入一些数据 cursor.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT)''') cursor.execute("INSERT INTO users(name) VALUES ('Alice')") cursor.execute("INSERT INTO users(name) VALUES ('Bob')") # 打开游标并读取数据 cursor.execute("SELECT * FROM users") for row in cursor: print(row) # 关闭资源 cursor.close() connection.commit() connection.close() ``` 在这个示例中,`cursor` 对象负责管理查询结果,并支持迭代器协议来逐一获取每一条记录。 ##### 示例 2: 使用 PostgreSQL (`psycopg2`) 处理大结果集 对于较大的数据集,可以通过显声明游标的方减少内存占用: ```python import psycopg2 conn = psycopg2.connect(database="testdb", user='postgres', password='password', host='localhost', port= '5432') cur = conn.cursor('my_cursor_name') # 声明命名游标 cur.execute("SELECT * FROM large_table") # 查询大量数据 while True: records = cur.fetchmany(1000) # 每次只取出一部分数据 if not records: break for record in records: process(record) # 替换为实际业务逻辑函数 cur.close() conn.close() ``` 上述代码片段展示了如何利用 `fetchmany()` 方法分批提取数据,从而优化性能[^2]。 #### T-SQL 中的游标语法 如果目标环境是 Microsoft SQL Server,则可能涉及 T-SQL 编写的存储过程或其他脚本形的操作。下面是一个简单的案例说明如何创建和使用游标: ```sql DECLARE @name NVARCHAR(50), @id INT; -- 定义游标 DECLARE my_cursor CURSOR FOR SELECT id, name FROM employees; -- 打开游标 OPEN my_cursor; FETCH NEXT FROM my_cursor INTO @id, @name; WHILE @@FETCH_STATUS = 0 BEGIN PRINT CONCAT(@id, ': ', @name); -- 或者其他处理方 FETCH NEXT FROM my_cursor INTO @id, @name; END CLOSE my_cursor; DEALLOCATE my_cursor; ``` 此段程序演示了从员工表中检索所有姓名及其 ID 并打印出来的方法[^3]。 尽管如此,在现代开发实践中应尽可能避免频繁依赖游标完成批量任务,因为其效率较低且容易引发锁争用等问题。推荐改写成集合运算的形以提高整体表现力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值