SQL游标使用

合集下载

SQL中的循环、for循环、游标

SQL中的循环、for循环、游标

SQL中的循环、for循环、游标我们使⽤SQL语句处理数据时,可能会碰到⼀些需要循环遍历某个表并对其进⾏相应的操作(添加、修改、删除),这时我们就需要⽤到咱们在编程中常常⽤的for或foreach,但是在SQL中写循环往往显得那么吃⼒,翻遍⽹上的资料,找不到⼏个正确的并能执⾏的循环处理数据的⽅法,在这⾥,我来给⼤家分享⼀下!要SQL中写类似for循环,我这⾥使⽤的是SQL中的游标来实现,当然SQL中也有for loop、while do等,我这⾥仅以使⽤游标⽅式来进⾏⽰例,其它的⽅式⼤家有兴趣可以研究⼀下,成功的同学可以在下⾯回复⼀下并把代码贴出来,与⼤家分享!闲话少说,上⽰例:1. 利⽤游标循环更新、删除MemberAccount表中的数据DECLARE My_Cursor CURSOR--定义游标FOR (SELECT*FROM dbo.MemberAccount) --查出需要的集合放到游标中OPEN My_Cursor; --打开游标FETCH NEXT FROM My_Cursor ; --读取第⼀⾏数据WHILE@@FETCH_STATUS=0BEGIN--UPDATE dbo.MemberAccount SET UserName = UserName + 'A' WHERE CURRENT OF My_Cursor; --更新--DELETE FROM dbo.MemberAccount WHERE CURRENT OF My_Cursor; --删除FETCH NEXT FROM My_Cursor; --读取下⼀⾏数据ENDCLOSE My_Cursor; --关闭游标DEALLOCATE My_Cursor; --释放游标GO2. 利⽤游标循环更新MemberService表中的数据(更新每个⽤户所购买服务的时间)DECLARE@UserId varchar(50)DECLARE My_Cursor CURSOR--定义游标FOR (SELECT UserId FROM dbo.MemberAccount) --查出需要的集合放到游标中OPEN My_Cursor; --打开游标FETCH NEXT FROM My_Cursor INTO@UserId; --读取第⼀⾏数据(将MemberAccount表中的UserId放到@UserId变量中)WHILE@@FETCH_STATUS=0BEGINPRINT@UserId; --打印数据(打印MemberAccount表中的UserId)UPDATE dbo.MemberService SET ServiceTime =DATEADD(Month, 6, getdate()) WHERE UserId =@UserId; --更新数据FETCH NEXT FROM My_Cursor INTO@UserId; --读取下⼀⾏数据(将MemberAccount表中的UserId放到@UserId变量中)ENDCLOSE My_Cursor; --关闭游标DEALLOCATE My_Cursor; --释放游标GO上⾯的两个例⼦应该可以解决我们在SQL中使⽤循环的所有需求,如果不能满⾜,⾃⼰可以根据以上两个⽰例进⾏扩展,希望能帮各位解决⼀些类似的问题。

postsql游标loop用法

postsql游标loop用法

postsql游标loop用法PostgreSQL游标循环用法什么是游标?在PostgreSQL中,游标(Cursor)是一种用于遍历查询结果集的数据库对象。

游标可以看作是一个指向结果集某一行的指针,通过控制游标,我们可以逐一访问结果集中的每一行数据。

游标的创建DECLARE <cursor_name> CURSOR FOR <select_query>;•<cursor_name>:游标的名称,可以根据需要自定义。

•<select_query>:查询结果集的SQL语句。

游标的打开和关闭OPEN <cursor_name>;CLOSE <cursor_name>;当游标被打开后,我们可以开始使用FETCH语句来获取结果集的每一行数据。

游标的循环FETCH [NEXT | PRIOR | FIRST | LAST | ABSOLUTE n | R ELATIVE n] FROM <cursor_name> INTO <variables>;•NEXT:按照结果集的顺序获取下一行数据。

•PRIOR:按照结果集的顺序获取上一行数据。

•FIRST:获取结果集的第一行数据。

•LAST:获取结果集的最后一行数据。

•ABSOLUTE n:跳转到结果集的第n行数据。

•RELATIVE n:相对当前位置跳转n行数据。

游标循环的示例DECLARE cur_employee CURSOR FOR SELECT * FROM emplo yees;OPEN cur_employee;LOOPFETCH NEXT FROM cur_employee INTO emp_id, emp_name; EXIT WHEN NOT FOUND;-- 在循环中对每一行数据进行处理-- ...END LOOP;CLOSE cur_employee;以上示例中,我们创建了一个名为cur_employee的游标,并打开它。

sqlserver 游标 loop循环方法

sqlserver 游标 loop循环方法

SQL Server游标是一种用于在数据库中进行遍历和处理数据的方法。

在SQL Server中,通常使用游标来逐行处理结果集或进行复杂的数据操作。

游标通常被认为是一种低效的方法,但在某些情况下,它也是必需的。

在SQL Server中,可以使用游标来遍历结果集。

游标一般包括打开游标、获取数据、处理数据和关闭游标等步骤。

在处理大量数据或需要逐行操作结果集时,可以使用游标来实现。

对于SQL Server中游标的循环方法,可以使用以下步骤来实现:1. 声明游标:在开始使用游标之前,首先需要声明游标变量,并将查询结果集赋值给游标变量。

2. 打开游标:声明游标后,需要打开游标以便开始处理数据。

3. 获取数据:使用FETCH语句从游标中获取一行数据,并将其赋值给变量。

在获取数据之前,通常会使用WHILE循环来检查游标是否还有数据可获取。

4. 处理数据:获取数据后,可以对数据进行相应的处理操作。

可以在这一步中实现需要的逻辑处理或数据操作。

5. 关闭游标:在完成数据处理后,需要关闭游标以释放资源并结束游标的使用。

使用游标进行循环操作在某些情况下是必需的,例如需要逐行对结果集进行操作或需要在游标中使用复杂的逻辑判断。

然而,由于游标会逐行处理数据,因此在处理大量数据时可能会导致性能问题。

在使用游标时需要谨慎考虑,并尽量避免在大型数据集上使用游标来提高性能。

从个人观点来看,游标在特定的场景下是一种有效的数据操作方法,但需要在使用时谨慎考虑性能和效率的问题。

在大多数情况下,可以通过优化查询语句或使用其他方法来代替游标来实现相同的功能。

在编写SQL Server代码时,需要根据实际情况选择合适的数据操作方法,以确保能够达到更好的性能和效率。

SQL Server游标是一种用于在数据库中进行数据操作的方法,但需要在使用时注意性能和效率的问题。

对于需要逐行处理数据或进行复杂逻辑判断的情况,可以使用游标来实现相应的功能。

然而,在大多数情况下,可以通过优化查询语句或使用其他方法来代替游标来提高性能。

sql游标的使用方法

sql游标的使用方法

sql游标的使用方法
SQL游标用于在查询结果集中遍历每一行数据,可以使用以下步骤来使用游标:
1. 声明游标:使用DECLARE语句声明一个游标,指定查询语句,并设置游标的名称。

2. 打开游标:使用OPEN语句打开游标,将查询结果集绑定到游标上。

3. 获取数据:使用FETCH语句从游标中获取数据,可以根据需要获取一行数据或者获取全部数据。

4. 处理数据:对获取的数据进行需要的处理,可以进行计算、更新、删除等操作。

5. 关闭游标:使用CLOSE语句关闭游标,释放资源。

6. 释放游标:使用DEALLOCATE语句释放游标所占用的资源。

下面是一个使用游标的示例:
```sql
DECLARE cur_employee CURSOR FOR
SELECT employee_id, employee_name FROM employees; OPEN cur_employee;
FETCH NEXT FROM cur_employee INTO @emp_id, @emp_name;
WHILE @@FETCH_STATUS = 0
BEGIN
-- 对数据进行处理
...
FETCH NEXT FROM cur_employee INTO @emp_id, @emp_name;
END
CLOSE cur_employee;
DEALLOCATE cur_employee;
```。

SQL游标使用方法

SQL游标使用方法

SQL游标使用方法SQL游标是一种用于处理查询结果集的数据库对象。

游标可以被认为是一个指向查询结果集中的其中一行的指针,通过游标可以逐个获取结果集中的数据记录,对结果集进行遍历、更新、删除等操作。

下面将详细介绍SQL游标的使用方法。

1.使用DECLARE语句声明游标并指定游标的名称、游标的查询语句以及返回结果集的数据类型。

例如:DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name WHERE condition;2.使用OPEN语句打开游标,使得游标可以进行后续操作。

例如:OPEN cursor_name;1.使用FETCH语句获取游标的当前行数据,并且将游标指针移动到下一行。

FETCH cursor_name INTO variable1, variable2, ...;2.使用WHILE循环结构对游标进行迭代,直到游标无法再获取到下一行数据为止。

BEGIN--执行操作,处理游标当前行数据...--获取下一行数据FETCH cursor_name INTO variable1, variable2, ...;END;3.使用CLOSE语句关闭游标,释放游标使用的资源。

CLOSE cursor_name;4.使用DEALLOCATE语句释放游标的内存空间。

DEALLOCATE cursor_name;除了以上基本的游标使用方法之外,SQL游标还可以进行以下高级操作:1.可以使用SCROLL关键字创建可滚动的游标,允许在结果集中前后移动游标指针,而不仅仅是一行一行往前遍历。

DECLARE cursor_name CURSOR SCROLL FOR SELECT column1, column2 FROM table_name WHERE condition;2.可以使用FORUPDATE子句在游标中指定要更新的列,并且允许使用UPDATECURRENT语句对当前游标指向的数据进行更新操作。

postgresql游标的用法

postgresql游标的用法

postgresql游标的用法PostgreSQL游标的用法PostgreSQL是一种开源的关系型数据库管理系统,它支持多种编程语言,包括C、C++、Java、Python等。

在PostgreSQL中,游标是一种用于遍历查询结果集的机制,它可以让你在查询结果集中移动,并且可以对每个结果进行操作。

本文将介绍PostgreSQL游标的用法,包括游标的创建、使用和关闭等方面。

一、什么是游标?游标是一个与数据库连接相关联的指针,它指向查询结果集中当前行。

通过使用游标,你可以在查询结果集中移动,并且可以对每个结果进行操作。

二、创建游标要创建一个游标,在SQL语句中使用DECLARE CURSOR命令。

该命令需要指定一个唯一的名称作为游标的标识符,并且需要指定一个SELECT语句作为查询结果集。

例如:DECLARE my_cursor CURSOR FOR SELECT * FROM my_table;这将创建一个名为my_cursor的游标,它将返回my_table表中的所有行。

三、打开游标要打开一个已经声明的游标,在SQL语句中使用OPEN命令。

该命令需要指定之前声明时所使用的名称作为参数。

例如:OPEN my_cursor;这将打开名为my_cursor的游标,并将其置于第一行。

四、获取当前行要获取当前行,在SQL语句中使用FETCH命令。

该命令需要指定游标的名称和一个方向参数,用于指定要获取的行的相对位置。

例如:FETCH NEXT FROM my_cursor;这将获取名为my_cursor的游标中的下一行。

五、使用游标使用游标时,你可以在查询结果集中移动,并且可以对每个结果进行操作。

例如,你可以使用循环来遍历结果集中的每一行,并执行一些操作。

例如:DECLARE my_cursor CURSOR FOR SELECT * FROM my_table; OPEN my_cursor;LOOPFETCH NEXT FROM my_cursor INTO var1, var2, var3;EXIT WHEN NOT FOUND;-- 在这里执行对当前行的操作END LOOP;在上面的例子中,我们声明了一个名为my_cursor的游标,并打开了它。

sql中cursor的用法

sql中cursor的用法

sql中cursor的用法SQL中的Cursor用法在SQL中,Cursor(游标)是一种用于处理查询结果集的机制,它允许我们逐行处理查询结果,类似于在程序中使用迭代器来遍历集合。

本文将介绍Cursor的用法,包括Cursor的声明、打开、关闭以及使用过程中的注意事项。

1. Cursor的声明在SQL中,我们首先需要声明一个Cursor来定义要处理的查询结果集。

Cursor的声明通常包括以下几个步骤:(1)使用DECLARE关键字声明Cursor的名称和数据类型。

例如:DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name;(2)使用OPEN关键字打开Cursor,使其准备好返回数据。

例如:OPEN cursor_name;(3)使用FETCH NEXT关键字获取第一行数据,并将光标移动到下一行。

例如:FETCH NEXT FROM cursor_name INTO @variable1, @variable2;(4)使用CLOSE关键字关闭Cursor,释放相关资源。

例如:CLOSE cursor_name;(5)使用DEALLOCATE关键字释放Cursor的内存空间。

例如:DEALLOCATE cursor_name;2. Cursor的使用Cursor的使用通常包括以下几个步骤:(1)声明一个Cursor并打开它。

(2)使用FETCH NEXT语句获取第一行数据,并将光标移动到下一行。

(3)使用WHILE循环来遍历查询结果集,直到所有行都被处理完毕。

(4)在循环中,可以根据需要对每一行数据进行处理,例如进行计算、更新或删除操作等。

(5)在循环结束后,关闭Cursor并释放相关资源。

3. Cursor的注意事项在使用Cursor时,需要注意以下几点:(1)Cursor的声明和使用应该放在BEGIN和END之间,以确保它们在同一个作用域内。

游标的使用流程是什么样的

游标的使用流程是什么样的

游标的使用流程是什么样的什么是游标游标(Cursor)是一种用于在关系型数据库管理系统中对查询结果集进行逐行处理的机制。

游标可以看作是一个指向结果集中当前行的指针,并且可以根据自己的需要在结果集中前进、后退、跳过、插入和删除当前行。

游标的使用流程使用游标的流程一般包括以下几个步骤:1.声明游标:在SQL语句中使用DECLARE CURSOR语句创建游标,并指定游标的名称和属性。

2.打开游标:使用OPEN CURSOR语句打开游标。

3.获取数据:使用FETCH语句或其他相关命令从游标中获取数据。

4.处理数据:对获取到的数据进行处理、计算或其他操作。

5.关闭游标:使用CLOSE CURSOR语句关闭游标。

6.释放游标:在不再需要使用游标时,使用DEALLOCATE CURSOR语句释放游标的资源。

具体的流程可以用以下列点方式呈现:•声明游标:–使用DECLARE CURSOR语句,在SQL语句中创建游标。

–指定游标的名称和属性,如游标的类型(FORWARD_ONLY、SCROLL等)和可选的游标选项(STATIC、DYNAMIC、KEYSET等)。

•打开游标:–使用OPEN CURSOR语句打开游标,将结果集中的数据加载到游标中。

•获取数据:–使用FETCH语句或其他相关命令从游标中获取数据。

–可以使用FETCH NEXT命令获取下一行数据,也可以使用FETCH PRIOR命令获取上一行数据,还可以使用FETCH FIRST和FETCHLAST获取第一行和最后一行数据。

•处理数据:–对获取到的数据进行处理、计算或其他操作。

–可以使用游标执行各种SQL操作,如更新、删除、插入等。

•关闭游标:–使用CLOSE CURSOR语句关闭游标。

–关闭游标后,游标便不再指向任何结果集中的行。

•释放游标:–使用DEALLOCATE CURSOR语句释放游标的资源。

–释放游标后,游标将无法再使用。

以上就是使用游标的基本流程,并且这个流程可以根据具体的需求进行调整和扩展。

SQL游标(cursor)详细说明及内部循环使用示例

SQL游标(cursor)详细说明及内部循环使用示例

SQL游标(cursor)详细说明及内部循环使⽤⽰例游标 游标(cursor)是系统为⽤户开设的⼀个数据缓冲区,存放SQL语句的执⾏结果。

每个游标区都有⼀个名字,⽤户可以⽤SQL语句逐⼀从游标中获取记录,并赋给主变量,交由主语⾔进⼀步处理。

游标是处理结果集的⼀种机制吧,它可以定位到结果集中的某⼀⾏,多数据进⾏读写,也可以移动游标定位到你所需要的⾏中进⾏操作数据。

⼀般复杂的存储过程,都会有游标的出现,他的⽤处主要有:1. 定位到结果集中的某⼀⾏。

2. 对当前位置的数据进⾏读写。

3. 可以对结果集中的数据单独操作,⽽不是整⾏执⾏相同的操作。

4. 是⾯向集合的数据库管理系统和⾯向⾏的程序设计之间的桥梁。

优点 在数据库中,游标是⼀个⼗分重要的概念。

游标提供了⼀种对从表中检索出的数据进⾏操作的灵活⼿段,就本质⽽⾔,游标实际上是⼀种能从包括多条数据记录的结果集中每次提取⼀条记录的机制。

游标总是与⼀条SQL 查询语句相关联因为游标由结果集(可以是零条、⼀条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。

当决定对结果集进⾏处理时,必须声明⼀个指向该结果集的游标。

如果曾经⽤C 语⾔写过对⽂件进⾏处理的程序,那么游标就像您打开⽂件所得到的⽂件句柄⼀样,只要⽂件打开成功,该⽂件句柄就可代表该⽂件。

对于游标⽽⾔,其道理是相同的。

可见游标能够实现按与传统程序读取平⾯⽂件类似的⽅式处理来⾃基础表的结果集,从⽽把表中数据以平⾯⽂件的形式呈现给程序。

我们知道关系数据库管理系统实质是⾯向集合的,在MS SQL SERVER 中并没有⼀种描述表中单⼀记录的表达形式,除⾮使⽤where ⼦句来限制只有⼀条记录被选中。

因此我们必须借助于游标来进⾏⾯向单条记录的数据处理。

由此可见,游标允许应⽤程序对查询语句select 返回的⾏结果集中每⼀⾏进⾏相同或不同的操作,⽽不是⼀次对整个结果集进⾏同⼀种操作;它还提供对基于游标位置⽽对表中数据进⾏删除或更新的能⼒;⽽且,正是游标把作为⾯向集合的数据库管理系统和⾯向⾏的程序设计两者联系起来,使两个数据处理⽅式能够进⾏沟通。

sql server 游标的使用例子

sql server 游标的使用例子

SQL Server游标的使用例子1.概述SQL Server是一种常用的关系型数据库管理系统,它提供了多种数据访问和处理的工具和功能。

其中,游标是一种用来在SQL Server中逐行处理数据的重要工具。

本文将介绍SQL Server游标的使用方法和例子。

2.游标的基本概念游标是一种用来在SQL Server中逐行处理数据的机制。

它允许用户逐行访问数据集,对每一行数据进行操作。

游标可以在存储过程或触发器中使用,以实现对数据的逐行处理。

3.游标的使用方法SQL Server中使用游标需要经过以下几个步骤:1) 声明游标:使用DECLARE语句声明游标,并定义游标的属性,如游标的名称、数据集的名称等。

2) 打开游标:使用OPEN语句打开游标,将数据集的内容加载到游标中,以供后续的处理。

3) 读取数据:使用FETCH语句逐行读取游标中的数据,处理每一行数据。

4) 关闭游标:使用CLOSE语句关闭游标,释放与游标相关的资源。

5) 销毁游标:使用DEALLOCATE语句销毁游标,释放游标占用的内存。

4.游标的使用例子下面通过一个简单的例子来介绍SQL Server游标的使用方法。

假设有一个名为"Employee"的表,表中包含员工的ID、尊称和薪水等字段。

现在需要计算每个员工的薪水涨幅,并将结果输出。

可以通过游标来实现这个需求。

```sql-- 声明变量DECLARE EmployeeID INT, EmployeeName NVARCHAR(50), Salary DECIMAL(10, 2), Increment DECIMAL(10, 2)-- 声明游标DECLARE employee_cursor CURSOR FORSELECT EmployeeID, EmployeeName, SalaryFROM Employee-- 打开游标OPEN employee_cursor-- 读取数据FETCH NEXT FROM employee_cursor INTO EmployeeID, EmployeeName, SalaryWHILE FETCH_STATUS = 0BEGINSET Increment = Salary * 0.1 -- 假设薪水涨幅为10PRINT 'Employee ' + EmployeeName + '''s salary will increase by ' + CONVERT(NVARCHAR(20), Increment)FETCH NEXT FROM employee_cursor INTO EmployeeID, EmployeeName, SalaryEND-- 关闭游标CLOSE employee_cursor-- 销毁游标DEALLOCATE employee_cursor```以上代码中,首先声明了一些变量,然后声明了游标"employee_cursor",并使用SELECT语句将"Employee"表中的数据加载到游标中。

SQL工作笔记-达梦7存储过程中游标的使用(for循环IF等)

SQL工作笔记-达梦7存储过程中游标的使用(for循环IF等)

SQL⼯作笔记-达梦7存储过程中游标的使⽤(for循环IF等)表如下:如下存储过程使⽤游标遍历所有数据:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASmyId int;myName varchar(50);cursor myCursor is select id, name from cfftest.student;BEGINopen myCursor;loopfetch myCursor into myId, myName;exit when myCursor%notfound;print 'id: ' || myId || ' name' || myName;end loop;close myCursor;END;运⾏截图如下:如果需要添加⼀个返回的结果集添加如下即可:Select ‘ok’;CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT) ASmyId int;myName varchar(50);cursor myCursor is select id, name from cfftest.student;BEGINopen myCursor;loopfetch myCursor into myId, myName;exit when myCursor%notfound;print 'id: ' || myId || ' name' || myName;end loop;close myCursor;select 'ok';END;运⾏截图如下:使⽤for循环进⾏遍历,运⾏截图如下源码如下:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASBEGINfor recordOne in (select id, name from cfftest.student) loopprint recordOne.id || ' ' || ;end loop;select 'ok';END;⼀般获取单条数据可以这样做:运⾏截图如下:源码如下:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASmyname varchar(50);BEGINselect name into myname from cfftest.student where id="id";print 'name is ' || myname;END;这⾥还可以增加if等功能源码如下:CREATE OR REPLACE PROCEDURE "CFFTEST"."SELECT_STUDENT"("id" IN INT)ASmyCount int;BEGINselect count(*) into myCount from cfftest.student where id="id";if myCount > 0 thenselect '存在数据';elseselect '不存中数据';end if;END;。

SQL游标的使用

SQL游标的使用

SQL游标的使用游标的使用步骤主要包括声明游标、打开游标、获取数据、处理数据和关闭游标。

首先,我们需要声明一个游标,并指定该游标的类型和返回结果集的数据类型。

常见的游标类型有静态游标、动态游标和键控游标,选择适合的类型可以提高游标的性能和可用性。

例如,使用静态游标可以避免数据修改对结果集的影响,但会消耗更多的系统资源。

接下来,我们需要打开游标,这样可以将游标与结果集绑定在一起。

通过执行一个SQL查询语句,我们可以获取一组符合条件的数据,并将其存储在游标中。

一旦游标打开,我们就可以使用FETCH语句来获取游标中的数据。

FETCH语句可以指定获取的数据量、数据位置和数据排序方式。

在默认情况下,FETCH语句会返回一行数据。

获取数据后,我们可以对数据进行处理。

可以使用游标的值在数据库中进行操作,或者将游标的值存储在变量中进行处理。

通过循环遍历游标的方式,我们可以逐行处理结果集中的数据。

在处理数据时,可以对数据进行修改、删除或插入操作。

可以使用UPDATE、DELETE和INSERT语句来更新数据库中的数据。

在对数据进行修改操作后,需要使用COMMIT语句提交事务,以保存所做的修改。

处理完数据后,我们需要关闭游标,以释放游标所占用的系统资源。

可以使用CLOSE语句关闭游标,并释放与其相关的内存和其他资源。

在处理过程中,还需要注意一些游标的使用规则和限制。

例如,游标只能在存储过程或触发器中使用,不支持在普通的SQL语句中使用。

游标也需要使用DECLARE语句进行声明,并且声明的位置必须在数据处理操作之前。

另外,游标的使用还需要考虑性能和效率的问题。

如果需要处理大量的数据,可以使用游标的子集功能,只返回需要处理的数据,避免提取全部数据带来的性能压力。

还可以结合使用索引和查询优化技术,提高游标的查询和处理效率。

总结起来,SQL游标是一种用于处理多行数据的结果集的技术。

通过声明、打开、获取数据、处理数据和关闭游标等步骤,可以方便地对数据库中的数据进行逐行处理操作。

sql中游标的定义和使用

sql中游标的定义和使用

sql中游标的定义和使⽤游标的类型:1、静态游标(不检测数据⾏的变化)2、动态游标(反映所有数据⾏的改变)3、仅向前游标(不⽀持滚动)4、键集游标(能反映修改,但不能准确反映插⼊、删除)游标使⽤顺序:1、定义游标2、打开游标3、使⽤游标4、关闭游标5、释放游标语法declare 游标名 cursor [LOCAL | GLOBAL][FORWARD_ONLY | SCROLL][STATIC | KEYSET | DYNAMIC ] [READ_ONLY | SCROLL_LOCKS]for selet语句 [for update[of 列名[,列名]]注:LOCAL 局部游标 GLOBAL 全局游标FORWARD_ONLY 仅向前 SCROLL 滚动STATIC 静态 KEYSET 键集 DYNAMIC 动态READ_ONLY 只读 SCROLL_LOCKS 锁定游标当前⾏获取游标的数据FETCH [[NEXT | PRIOR | FIRST | LAST |ABSOLUTE{ n | @nvar | RELATIVE { n | @nvar}]From ] 游标名 [into 变量]注:NEXT 下⼀⾏ PRIOR 上⼀⾏ FIRST 第⼀⾏LAST 最后⼀⾏ ABSOLUTE n 第n⾏RELATIVE n 当前位置开始的第n⾏into 变量把当前⾏的各字段值赋值给变量游标状态变量:@@fetch_status 游标状态0 成功 -1 失败 -2 丢失@@cursor_rows 游标中结果集中的⾏数n ⾏数 -1 游标是动态的 0 空集游标操作游标的当前⾏:current of 游标名例1:利⽤游标对查询的数据集进⾏遍历use pubsgodeclare @auid char(12),@aulname varchar(20),@aufname varchar(20), @st char(2),@auinfo varchar(50)declare auth_cur cursor forselect au_id, au_lname, au_fname, statefrom authorsopen auth_curfetch next from auth_cur into @auid,@aulname,@aufname, @stwhile (@@fetch_status=0)beginprint '作者编号: '+@auidprint '作者姓名: '+@aulname+','+@aufnameprint '所在州: '+@stprint '--------------------------'fetch next from auth_cur into @auid,@aulname,@aufname, @stendclose auth_curdeallocate auth_cur例2:利⽤游标修改、删除数据declare auth_cur cursor scroll forselect au_id, au_lname, au_fname, statefrom authors for update of au_lnameopen auth_curdeclare @rowcount intset @rowcount = 6fetch absolute @rowcount from auth_cur --将变量@rowcount标识的⾏设置为当前⾏--下⾯1⾏是利⽤游标进⾏修改操作update authors set au_lname='张' where current of auth_cur --修改游标中的当前⾏--下⾯1⾏是利⽤游标进⾏删除操作delete from authors where current of auth_cur。

SQLServer 游标简介与使用说明

SQLServer 游标简介与使用说明

SQLServer 游标简介与使用说明游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。

我们可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。

1.游标的组成游标包含两个部分:一个是游标结果集、一个是游标位置。

游标结果集:定义该游标得SELECT语句返回的行的集合。

游标位置:指向这个结果集某一行的当前指针。

2.游标的分类游标共有3类:API服务器游标、Transaction-SQL游标和API客户端游标。

其中前两种游标都是运行在服务器上的,所以又叫做服务器游标。

API服务器游标API服务器游标主要应用在服务上,当客户端的应用程序调用API游标函数时,服务器会对API函数进行处理。

使用API函数和方法可以实现如下功能:(1)打开一个连接。

(2)设置定义游标特征的特性或属性,API自动将游标影射到每个结果集。

(3)执行一个或多个Transaction-SQL语句。

(4)使用API函数或方法提取结果集中的行。

API服务器游标包含以下四种:静态游标、动态游标、只进游标、键集驱动游标(Primary key)静态游标的完整结果集将打开游标时建立的结果集存储在临时表中,(静态游标始终是只读的)。

静态游标具有以下特点:总是按照打开游标时的原样显示结果集;不反映数据库中作的任何修改,也不反映对结果集行的列值所作的更改;不显示打开游标后在数据库中新插入的行;组成结果集的行被其他用户更新,新的数据值不会显示在静态游标中;但是静态游标会显示打开游标以后从数据库中删除的行。

动态游标与静态游标相反,当滚动游标时动态游标反映结果集中的所有更改。

结果集中的行数据值、顺序和成员每次提取时都会改变。

只进游标不支持滚动,它只支持游标从头到尾顺序提取数据行。

注意:只进游标也反映对结果集所做的所有更改。

键集驱动游标同时具有静态游标和动态游标的特点。

SQL中游标(cursor)的基本使用实例

SQL中游标(cursor)的基本使用实例

SQL中游标(cursor)的基本使⽤实例⽬录类型:1.普通游标2.滚动游标具体FETCH⽤法:Arguments总结类型: 1.普通游标只有NEXT操作 2.滚动游标有多种操作1.普通游标DECLARE @username varchar(20),@UserId varchar(100)DECLARE cursor_name CURSOR FOR --定义游标SELECT TOP 10 UserId,UserName FROM UserInfoORDER BY UserId DESCOPEN cursor_name --打开游标FETCH NEXT FROM cursor_name INTO @UserId,@username --抓取下⼀⾏游标数据WHILE @@FETCH_STATUS = 0BEGINPRINT '⽤户ID:'+@UserId+' '+'⽤户名:'+@usernameFETCH NEXT FROM cursor_name INTO @UserId,@usernameENDCLOSE cursor_name --关闭游标DEALLOCATE cursor_name --释放游标结果:⽤户ID:zhizhi ⽤户名:邓鸿芝⽤户ID:yuyu ⽤户名:魏⾬⽤户ID:yujie ⽤户名:李⽟杰⽤户ID:yuanyuan ⽤户名:王梦缘⽤户ID:YOUYOU ⽤户名:lisi⽤户ID:yiyiren ⽤户名:任毅⽤户ID:yanbo ⽤户名:王艳波⽤户ID:xuxu ⽤户名:陈佳绪⽤户ID:xiangxiang ⽤户名:李庆祥⽤户ID:wenwen ⽤户名:魏⽂⽂2.滚动游标--带SCROLL选项的游标SET NOCOUNT ONDECLARE C SCROLL CURSOR FOR --SCORLL 后,有了更多的游标操作(滚动游标)SELECT TOP 10 UserId,UserName FROM UserInfoORDER BY UserId DESCOPEN CFETCH LAST FROM C --最后⼀⾏的数据,并将当前⾏为指定⾏FETCH ABSOLUTE 4 FROM C --从第⼀⾏开始的第4⾏数据,并将当前⾏为指定⾏这⾥的n可正可负,n>0 往下翻,n<0 往上翻FETCH RELATIVE 3 FROM C --相对于当前⾏的后3⾏数据,并将当前⾏为指定⾏这⾥的n可正可负FETCH RELATIVE -2 FROM C --相对于当前⾏的前2⾏数据,并将当前⾏为指定⾏FETCH PRIOR FROM C ----相对于当前⾏的前1⾏数据FETCH FIRST FROM C --刚开始第⼀⾏的数据,并将当前⾏为指定⾏FETCH NEXT FROM C --相对于当前⾏的后1⾏数据CLOSE CDEALLOCATE C结果(可以参考第⼀个结果分析):具体FETCH⽤法:FETCH[ [ NEXT | PRIOR | FIRST | LAST| ABSOLUTE { n | @nvar }| RELATIVE { n | @nvar }]FROM]{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }[ INTO @variable_name [ ,...n ] ]ArgumentsNEXTReturns the result row immediately following the current row and increments the current row to the row returned. If FETCH NEXT is the first fetch against a cursor, it returns the first row in the result set. NEXT is the default cursor fetch option.PRIORReturns the result row immediately preceding the current row, and decrements the current row to the row returned. If FETCH PRIOR is the first fetch against a cursor, no row is returned and the cursor is left positioned before the first row.FIRSTReturns the first row in the cursor and makes it the current row.LASTReturns the last row in the cursor and makes it the current row.ABSOLUTE { n| @nvar}If n or @nvar is positive, returns the row n rows from the front of the cursor and makes the returned row the new current row. If n or @nvar is negative, returns the row n rows before the end of the cursor and makes the returned row the new current row. If n or @nvar is 0, no rows are returned. n must be an integer constant and @nvar must be smallint, tinyint, or int.RELATIVE { n| @nvar}If n or @nvar is positive, returns the row n rows beyond the current row and makes the returned row the new current row. If n or @nvar is negative, returns the row n rows prior to the current row and makes the returned row the new current row. If n or @nvar is 0, returns the current row. If FETCH RELATIVE is specified with n or @nvar set to negative numbers or 0 on the first fetch done against a cursor, no rows are returned. n must be an integer constant and @nvar must be smallint, tinyint, or int. GLOBALSpecifies that cursor_name refers to a global cursor.cursor_nameIs the name of the open cursor from which the fetch should be made. If both a global and a local cursor exist withcursor_name as their name, cursor_name to the global cursor if GLOBAL is specified and to the local cursor if GLOBAL is not specified.@cursor_variable_nameIs the name of a cursor variable referencing the open cursor from which the fetch should be made.INTO @variable_name[ ,...n]Allows data from the columns of a fetch to be placed into local variables. Each variable in the list, from left to right, is associated with the corresponding column in the cursor result set. The data type of each variable must either match or be a supported implicit conversion of the data type of the corresponding result set column. The number of variables must match the number of columns in the cursor select list.总结到此这篇关于SQL中游标(cursor)基本使⽤的⽂章就介绍到这了,更多相关SQL游标的使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

sql中cursor的种类

sql中cursor的种类

sql中cursor的种类SQL中的游标类型游标是SQL中用于处理查询结果集的一种机制。

它可以让我们逐行地访问和处理查询结果,而不是一次性将所有数据返回给客户端。

在SQL中,有以下几种常见的游标类型:1. 只读游标(READ ONLY CURSOR):这是最常见的游标类型,它允许我们对查询结果进行遍历,但不能修改或更新数据。

只读游标适用于需要对结果进行读取和分析的情况,比如生成报表或进行数据分析。

2. 可更新游标(UPDATABLE CURSOR):与只读游标不同,可更新游标允许我们对查询结果进行修改和更新。

这意味着我们可以使用游标来更新表中的数据,而不仅仅是读取数据。

这种类型的游标通常用于需要对结果进行修改的场景,比如数据的批量更新或删除。

3. 敏感游标(SENSITIVE CURSOR):敏感游标是一种特殊类型的游标,它能感知到对查询结果的任何修改。

当使用敏感游标时,如果其他用户对查询结果进行了修改,游标会自动反映这些修改。

这种类型的游标适用于需要实时反馈数据变化的情况,比如在网页上显示实时股票行情。

4. 不敏感游标(INSENSITIVE CURSOR):与敏感游标相反,不敏感游标在创建时会将结果集的快照保存在游标中,不会反映对结果集的任何修改。

这意味着不敏感游标对于结果集的修改是不可见的,只能看到创建游标时的数据。

不敏感游标适用于对结果集进行静态分析或离线处理的场景。

总结:SQL中的游标类型包括只读游标、可更新游标、敏感游标和不敏感游标。

不同的游标类型适用于不同的场景,可以让我们更灵活地处理查询结果集。

无论是生成报表、数据分析还是实时数据展示,都可以使用适当的游标类型来满足需求。

SQL的游标使用规则详解和范例

SQL的游标使用规则详解和范例

SQL的游标使用规则详解和范例MS-SQL的游标是一种临时的数据库对象,既对可用来旋转储存在系统永久表中的数据行的副本,也可以指向储存在系统永久表中的数据行的指针。

游标为您提供了在逐行的基础上而不是一次处理整个结果集为基础的操作表中数据的方法。

1.如何使用游标1)定义游标语句Declare <游标名> Cursor For2)创建游标语句Open <游标名>3)提取游标列值、移动记录指针Fetch <列名列表> From <游标名> [Into <变量列表>] 4)使用@@Fetch_Status利用While循环处理游标中的行5)删除游标并释放语句Close <游标名>/Deallocate <游标名>6)游标应用实例--定义游标Declare cur_Depart CursorFor Select cDeptID,cDeptName From Department into @DeptID,@DeptName--打开游标Open cur_Depart--移动或提取列值Fetch From cur_Depart into @DeptID,@DeptName--利用循环处理游标中的列值While @@Fetch_Status=0BeginPrint @DeptID,@DeptNameFetch From cur_Depart into @DeptID,@DeptNameEnd--关闭/释放游标Close cur_DepartDeallocate cur_Depart简单的过程:定义游标DECLARE CustomerCursor CURSOR FORSELECT acct_no,name,balanceFROM customerWHERE province="北京";打开游标OPEN CustomerCursor;提取数据--设置循环lb_continue=Truell_total=0DO WHILE lb_continueFETCH CustomerCursorINTO:ls_acct_no, :ls_name, :ll_balance;If sqlca.sqlcode=0 Thenll_total+=ll_balanceElselb_continue=FalseEnd IfLOOP--关闭游标CLOSE CustomerCursor;Deallocate CustomerCursor2.语句的详细及注意1)定义游标语句Declare <游标名> [Insensitive] [Scroll] CursorFor <Select 语句> [FOR {Read Only | Update [ OF <列名列表>]}]Insensitive DBMS创建查询结果集数据的临时副本(而不是使用直接引用数据库表中的真实数据行中的列)。

什么情况下使用游标

什么情况下使用游标

1、什么情况下使用游标?答:当查询的结果是一个集合(很多元组),就必须用游标逐一读取,相当于一个指针,可以在SQL语句中依次遍历某个select的结果集的每行记录每个字段,游标是可以从结果集中每次提取一条记录的机制,因为很多程序不具备操作一个集合的能力。

2、游标格式:declare @变量1 变量1类型,@变量2 变量2类型,...,@变量n 变量n类型;declare 游标名称 cursor forselect 字段名1,字段名2,...,字段名nfrom [数据库名].表名where条件[排序];open 游标名称;fetch next from 游标名称 into @变量1,@变量2,...,@变量n;while @@fetch_status=0beginsql语句endclose 游标名称;deallocate 游标名称;3、变量:@@CURSOR_ROWS:整型变量,表示在当前连接中打开的游标中的行数量;@@FETHC_STATUS:标记变量,表示当前游标指针的状态。

4、游标示例:declare @cursor cursor --创建游标set @cursor=cursorforselect _id,_name from users --设定游标欲操作的数据集open @cursor --打开游标fetch next from @cursor into @_id,@_name --移动游标指向到第一条数据,提取第一条数据存放在变量中while(@@fetch_status=0) --如果上一次操作成功则继续循环beginprint @_name --操作提出的数据fetch next from @cursor into @_id,@_name --继续提下一行endclose @cursor --关闭游标deallocate @curso --删除游标。

sqlserver 游标的用法

sqlserver 游标的用法

sqlserver 游标的用法游标(Cursor)是SQL Server中一种用于逐行处理查询结果集的机制。

游标可以将结果集分解为小的数据行集,使得我们能够以逐行方式处理数据。

游标通常用于需要逐行处理数据或者需要对结果集进行反向遍历的情况。

使用游标的基本语法如下:1.声明游标:```DECLARE cursor_name CURSORFORSELECT column_name(s)FROM tableWHERE condition;```其中cursor_name是游标的名称,可以自定义;SELECT语句用于定义游标的结果集。

2.打开游标:```OPEN cursor_name;```打开游标以后,就可以使用FETCH语句来获取结果集中的数据行。

3.获取数据行:```FETCH NEXT FROM cursor_name INTO variable_name;```FETCH语句用于获取游标当前指向的数据行,并将其存储到variable_name变量中。

4.处理数据行:```--对获取的数据行进行处理--更新或删除数据行UPDATE tableSET column_name = new_valueWHERE current_of cursor_name;--向数据行插入新数据INSERT INTO table(column_name)VALUES(new_value);```根据需要,我们可以对获取的数据行进行处理,可以进行数据更新、删除或插入等操作。

5.关闭游标:```CLOSE cursor_name;```关闭游标后,就无法再使用FETCH语句获取结果集的数据行。

6.释放游标:```DEALLOCATE cursor_name;```释放游标以后,游标的定义将不再有效。

游标的使用可以提供一种灵活的方式来处理查询结果集,但同时也可能带来一些性能问题。

游标的使用应该尽量避免在大型查询中使用,以免对数据库性能造成较大的影响。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
declare my_cursor cursor keyset for select * from info
--删除游标资源
deallocate my_cursor
--打开游标,在游标关闭或删除前都有效
open my_cursor
--关闭游标
close my_cursor
--声明局部变量
lb_continue=True
ll_total=0
DO WHILE lb_continue
FETCH CustomerCur-sor
INTO:ls_acct_no,
:ls_name,
:ll_balance;
If sqlca.sqlcode=0 Then
ll_total+=ll_balance
(2) API 游标
API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。
--定位到当前记录相对位置记录
fetch relative -88 from my_cursor into @id,@name,@address
select @id as id,@name as name,@address as address
--定位到当前记录前一条
fetch prior from my_cursor into @id,@name,@address
1.2 游标种类
MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标。
(1) Transact_SQL 游标
Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL 脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。
SQL游标原理和使用方法
在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句。但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记录。那么如何解决这种问题呢?游标为我们提供了一种极为优秀的解决方案。
1.1 游标和游标的优点
在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条T_SQL 选择语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。如果曾经用 C 语言写过对文件进行处理的程序,那么游标就像您打开文件所得到的文件句柄一样,只要文件打开成功,该文件句柄就可代表该文件。对于游标而言,其道理是相同的。可见游标能够实现按与传统程序读取平面文件类似的方式处理来自基础表的结果集,从而把表中数据以平面文件的形式呈现给程序。
由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标。
select count(id) from info
select * from info
--清除所有记录
truncate table info
我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。
由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
(3) 客户游标
客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL 语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。
由于打开游标是对数据库进行一些SQL SELECT的操作,它将耗费一段时间,主要取决于您使用的系统性能和这条语句的复杂程度。如果执行的时间较长,可以考虑将屏幕上显示的鼠标改为hourglass。
提取数据
当用OPEN语句打开了游标并在数据库中执行了查询后,您不能立即利用在查询结果集中的数据。您必须用FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入程序员指定的变量中。事实上,FETCH语句是游标使用的核心。在DataWindow和DataStore中,执行了Retrieve()函数以后,查询的所有结果全部可以得到;而使用游标,我们只能逐条记录地得到查询结果。
declare @id int,@name varchar(20),@address varchar(20)
--定位到指定位置的记录
fetch absolute 56488 from my_cursor into @id,@name,@address
select @id as id,@name as name,@address as address
for
select productname from product
open my_cursor
declare @pname sysname
声明游标
象使用其它类型的变量一样,使用一个游标之前,首先应当声明它。游标的声明包括两个部分:游标的名称;这个游标所用到的SQL语句。如要声明一个叫作Cus-tomerCursor的游标用以查询地址在北京的客户的姓名、帐号及其余额,您可以编写如下代码:
DECLARE CustomerCursor CURSOR FOR
IF Is_prov="北京"THEN
DECLARE CustomerCursor CURSOR FOR
SELECT acct_no,name,balance
FROM customer
WHERE province="北京";
ELSE
DECLARE CustomerCursor CURSOR FOR
已经声明并打开一个游标后,我们就可以将数据放入任意的变量中。在FETCH语句中您可以指定游标的名称和目标变量的名称。如下例:
FETCH CustmerCur-sor
INTO:ls_acct_no,
:ls_name,
:ll_balance;
从语法上讲,上面所述的就是一条合法的取数据的语句,但是一般我们使用游标却还应当包括其它的部分。正如我们前面所谈到的,游标只能一次从后台数据库中取一条记录,而在多数情况下,我们所想要作的是在数据库中从第一条记录开始提取,一直到结束。所以我们一般要将游标提取数据的语句放在一个循环体内,直至将结果集中的全部数据提取后,跳出循环圈。通过检测SQLCA.SQL-CODE的值,可以得知最后一条FETCH语句是否成功。一般,当SQLCODE值为0时表明一切正常,100表示已经取到了结果集的末尾,而其它值均表明操作出了问题,这样我们可以编写以下的代码:
select @id as id,@name as name,@address as address
实例:
use database1
declare my_cursor cursor scroll dynamic
/**//*scroll表示可随意移动游标指 针(否则只能向前),dynamic表示可以读写游标(否则游标只读)*/
--定位到首记录
fetch first from my_cursor into @id,@name,@address
select @id as id,@name as name,@address as address
--定位到尾记录
fetch last from my_cursor into @id,@name,@address
declare @i int
set @i=1
while @i<1000000
begin
insert into info values('Justin'+str(@i),'深圳'+str(@i))
set @i=@i+1
end
1.3 游标操作
使用游标有四种基本的步骤:声明游标、打开游标、提取数据、关闭游标。
Else
lb_continue=False
End If
LOOP
循环体的结构有多种,这里提到的是最常见的一种。也有的程序员喜爱将一条FETCH语句放在循环体的前面,循环体内再放置另外一条FETCH语句,并检测SQLCA.SQLCODE是否为100。但是这样做,维护时需同时修改两条FETCH语句,稍麻烦了些。
我们在前面曾经提到过,DECLARE语句的作用只是定义一个游标,在OPEN语句中这个游标才会真正地被执行。了解了这些,我们就可以很方便地实现这样的功能,在DECLARE的Where子句中加入变量作参数,如下所示:
相关文档
最新文档