sql 中CURSOR 的使用

简介: sql 中CURSOR 的使用http://www.bieryun.com/3273.html CURSOR是游标,常用于脚本处理。 这里主要介绍自己常用的方法,同时也会把网上的一般格式进行解释。

sql 中CURSOR 的使用http://www.bieryun.com/3273.html

CURSOR是游标,常用于脚本处理。

这里主要介绍自己常用的方法,同时也会把网上的一般格式进行解释。

一、游标一般格式:

DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,... FROM 表名 WHERE ...
OPEN 游标名称
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
WHILE @@FETCH_STATUS=0
BEGIN
SQL语句执行过程... ...
FETCH NEXT FROM 游标名称 INTO 变量名1,变量名2,变量名3,...
END
CLOSE 游标名称
DEALLOCATE 游标名称 (删除游标)

一般格式sql举例如下:

[sql] view plain copy

  1.  table1结构如下
  2.  id    int
  3.  name  varchar(50)
  4.  
  5.  declare @id int
  6.  declare @name varchar(50)
  7.  declare cursor1 cursor for         --定义游标cursor1
  8.  select * from table1               --使用游标的对象(跟据需要填入select文)
  9.  open cursor1                       --打开游标
  10.  
  11.  fetch next from cursor1 into @id,@name  --将游标向下移1行,获取的数据放入之前定义的变量@id,@name中
  12.  
  13.  while @@fetch_status=0           --判断是否成功获取数据   进入循环
  14.  begin
  15.  update table1 set name=name+'1'
  16.  where id=@id                           --进行相应处理(跟据需要填入SQL文)
  17.  
  18.  fetch next from cursor1 into @id,@name  --将游标向下移1行  相当于for(int i;i<n;i++) 中的i+1
  19.  end
  20.  
  21.  close cursor1                   --关闭游标
  22.  deallocate cursor1

其中while循环的判断条件:

@@FETCH_STATUS =0   FETCH 语句成功
@@FETCH_STATUS =-1 FETCH 语句失败或此行不在结果集中

@@FETCH_STATUS =-2 被提取的行不存在

二、我常用的一般格式:

DECLARE 游标名称 CURSOR FOR SELECT * FROM 表名 WHERE ...

begin
dbms_output.enable(buffer_size=>null);
for 变量名 in 游标名称 loop

SQL语句执行过程... ... 获取游标里的值 直接用 变量名.字段名

END LOOP;
CLOSE 游标名称
DEALLOCATE 游标名称 (删除游标)

三、嵌套循环:

案例: 红色部分是对于第二点常用格式上的添加,使得可以在循环中嵌套循环

declare
TYPE daynamic_cursor_type IS REF CURSOR; --黄色部分自定义
cursor bscl_mc_cur is
SELECT d.bscl_mc
FROM DB_YWBZ.ecm_bscl_common_content_data@db_ywbz_sc_old d
WHERE d.bscl_mc is not null
group by d.bscl_mc;
cur_zj_rows daynamic_cursor_type; --定义游标
v_sql varchar2(500);
v_zj varchar2(10);
begin
dbms_output.enable(buffer_size=>null);
for v_bscl_mc_cur in bscl_mc_cur loop
v_sql := 'SELECT zj,ZJ_DM FROM ecm_bscl_common_content_data d WHERE d.bscl_mc = '||chr(39)||v_bscl_mc_cur.bscl_mc||chr(39); --引号,记得加
dbms_output.put_line('=========='||v_bscl_mc_cur.bscl_mc);
open cur_zj_rows for v_sql;
LOOP
FETCH cur_zj_rows INTO v_zj; --获取值
EXIT WHEN cur_zj_rows%NOTFOUND; --判断是否存在值
dbms_output.put_line(v_zj); --操作
END LOOP;
end loop;
end;
相关文章
sql 中CURSOR 的使用
sql 中CURSOR 的使用 CURSOR是游标,常用于脚本处理。 这里主要介绍自己常用的方法,同时也会把网上的一般格式进行解释。 一、游标一般格式: DECLARE 游标名称 CURSOR FOR SELECT 字段1,字段2,字段3,.
1194 0
|
SQL XML JSON
refer cursor,sql转json数据
1.前提条件,安装json的包 2.创建JSON_UTIL_PKG CREATE OR REPLACE PACKAGE JSON_UTIL_PKG AUTHID CURRENT_USER ...
782 0
|
SQL Perl
pl/sql [Cursor Management]- Cursor Packages & Managing Cursor Packages
Consolidate Cursors and SQL in Packages By placing cursors inside packages, you control the use of SQL in your PL/SQL code.
910 0
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
144 13
|
6月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
6月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
82 6
|
6月前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
501 1
|
6月前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
457 3
|
5月前
|
SQL 安全 Java
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client
559 0
下一篇
开通oss服务