数据库实验十二--游标与存储过程

合集下载

MySQL中的游标操作与存储过程使用方法

MySQL中的游标操作与存储过程使用方法

MySQL中的游标操作与存储过程使用方法引言对于开发者来说,数据操作是一个非常重要的任务。

在MySQL中,游标操作和存储过程是两个非常常见的功能,它们可以帮助我们更高效、更灵活地操作和管理数据。

本文将介绍MySQL中的游标操作和存储过程的使用方法,帮助读者更好地应用这些功能。

第一部分:游标操作什么是游标?游标是一种数据库对象,它用于处理数据集。

通过游标,我们可以逐行处理查询结果,而不是一次性地将所有结果返回。

这对于处理大量数据或者需要在结果集上进行逐行处理的情况非常有用。

游标的基本使用方法在MySQL中,使用DECLARE语句声明游标,使用FETCH语句获取游标的下一行数据,使用CLOSE语句关闭游标。

下面是一个简单的示例:```DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROMtable_name;OPEN cursor_name;FETCH cursor_name INTO variable1, variable2;CLOSE cursor_name;```在这个示例中,我们首先声明了一个名为"cursor_name"的游标,然后打开游标并获取第一行数据到变量"variable1"和"variable2"中,最后关闭游标。

游标的类型MySQL支持两种类型的游标:FORWARD_ONLY和SCROLL。

FORWARD_ONLY游标只能向前遍历结果集,而SCROLL游标可以以任何顺序遍历结果集,包括向前、向后和随机访问。

使用游标实现分页查询游标非常适合实现分页查询功能。

通过游标,我们可以在一个较大的结果集中,按照一定的页大小逐页取出数据,而不需要一次性将所有数据加载到内存中。

下面是一个使用游标实现分页查询的示例:```DECLARE page_cursor SCROLL CURSOR FOR SELECT column1, column2 FROM table_name LIMIT start_index, page_size;OPEN page_cursor;FETCH page_cursor INTO variable1, variable2;WHILE NOT done DO-- 处理当前行数据...FETCH page_cursor INTO variable1, variable2;-- 判断是否还有下一页数据IF no_more_data THENSET done = TRUE;END IF;END WHILE;CLOSE page_cursor;```在这个示例中,我们使用了SCROLL游标,并通过LIMIT子句指定了查询的起始位置和页大小。

MySQL存储过程和游标

MySQL存储过程和游标

MySQL存储过程和游标⼀、存储过程什么是存储过程,为什么要使⽤存储过程以及如何使⽤存储过程,并且介绍创建和使⽤存储过程的基本语法。

什么是存储过程:存储过程可以说是⼀个记录集,它是由⼀些T-SQL语句组成的代码块,这些T-SQL语句代码像⼀个⽅法⼀样实现⼀些功能(对单表或多表的增删改查),然后再给这个代码块取⼀个名字,在⽤到这个功能的时候调⽤他就⾏了。

存储过程的好处:1. 由于数据库执⾏动作时,是先编译后执⾏的。

然⽽存储过程是⼀个编译过的代码块,所以执⾏效率要⽐T-SQL语句⾼。

2. ⼀个存储过程在程序在⽹络中交互时可以替代⼤堆的T-SQL语句,所以也能降低⽹络的通信量,提⾼通信速率。

3. 通过存储过程能够使没有权限的⽤户在控制之下间接地存取数据库,从⽽确保数据的安全存储过程的基本语法:--------------------创建存储过程------------------------------------CREATE PROCEDURE procedure_name( IN|OUT variable data_type)BENGINsql_statement;......END;-- MySQL⽀持IN(传递给存储过程)、OUT(从存储过程传出)-- variable 变量-- data_type 参数的数据类型-- sql_statement 中 INTO parameter 的把值保存到相应的变量中(通过INTO关键字)--------------------执⾏存储过程------------------------------------CALL procedure_name(@parameters);--------------------删除存储过程------------------------------------DROP PROCEDURE procedure_name;-- 如果指定的过程不存在,则DROP PROCEDURE将会产⽣⼀个错误。

数据库-存储过程-游标-函数

数据库-存储过程-游标-函数

数据库-存储过程-游标-函数⼀、存储过程SQL99标准提出的SQL-invoked-rountines的概念,它开分为存储过程与函数,这⾥⾸先介绍存储过程存储过程分为三类:系统存储过程(如:sp_help)、⾃定义存储过程、扩展存储过程存储过程可以理解为⼀个SQL语句块,完成⼀些复杂的功能,当然可以包含应⽤程序的业务,⽐如:分页,⽣成订单号等,存储过程可以接收应⽤程序传递的参数,并将查询的结果返回给应⽤程序1、存储过程的优点:1)、运⾏效率⾼,因为存储过程不会在每⼀次调⽤时都解释执⾏,随便说⼀句,SQL执⾏后的执⾏计划会放在缓存中,这样下⼀次相同的SQL执⾏就不⽤再次优化了,从⽽加快速度2)、存储过程降低了客户机与服务器的通信量,使⽤存储过程,就不⽤在应程序中拼SQL传回服务器,只须要存储过程名与参数就可以了3)、⽅便实施企业规则,可以在存储过程⾥加⼊业务逻辑2、存储过程的使⽤(重复使⽤)创建:create proc pc_whcasselect * from whc/*执⾏*/exec pc_whc⼆、游标游标可以理解为⼀个"指针",其指向的是⼀条记录,当⽤select语句得到⼀个结果集时,我们可以将它放到⼀个游标中,然后通过移动游标来读取每⼀条数据,并进⾏处理,感觉有点"遍历"数据游标的使⽤:1、定义游标:declare cursor_name cursorFor select 语句;2、打开游标:open cursor_name3、循环访问游标中的每⼀⾏数据:Fetch next from cursor_name into @参数列表4、游标的状态:@@fetch_status,⽤于判断游标fetch的状态,当为0时正常,不为⼀时异常5、关闭并释放资源例:declare @whcId nchar(5),@whc int;/*定义⼀个游标*/declare whc_cursor cursorfor select CustomerID,EmployeeID from dbo.Orders/*打开⼀个游标*/open whc_cursor/*移动指针,将数据放到变量中*/fetch next from whc_cursor into @whcId,@whcwhile @@fetch_status = 0beginprint @whcid+' '+convert(nchar(5),@whc)fetch next from whc_cursor into @whcId,@whcendclose whc_cursordeallocate whc_cursor三、函数函数相信⼤家都很清楚了,传递参数,然后返回⼀个结果,SQL中的函数也⼤致差不多,返回时使⽤ruturn,可以是int、varchar,table等类型,有了函数就可以把⼀些功能在⼀起,⽐如对数据的处理等函数的创建(例⼦说明):create function fun_whc(@str varchar(50))returns varchar(100)asbegindeclare @List varchar(200)set @List=@str+'My friend'--返回值return @Listend--调⽤select DemoName,dbo.fun_whc(DemoName) from whc最后要说明的是,⼩弟初学,哪⾥有不对的请指出,感激不尽。

数据库中的游标存储过程和触发器

数据库中的游标存储过程和触发器

数据库中的游标存储过程和触发器游标、存储过程和触发器是数据库中常用的三种特殊对象。

游标用于在数据库管理系统中对查询结果进行逐行处理,存储过程是一组预定义的SQL语句集合,可以被重复调用执行,而触发器则是在数据库中的特定事件发生时自动执行的一段代码。

首先,我们来了解一下游标。

游标是一个数据库概念,它可以被看作是一个指向查询结果集的指针。

通过游标,我们可以在数据库内部对查询结果集进行逐行处理,从而实现对数据的操作。

游标的使用可以有效地减少数据库服务器的负担,提高数据库性能。

在一些需要对批量数据进行处理的场景下,游标可以发挥重要作用。

例如,当需要对查询结果逐行进行计算、更新或者删除时,可以使用游标定位到每一条记录,并对其进行操作。

接下来,我们了解一下存储过程。

存储过程是一组预定义的SQL语句的集合,它们一起执行一些特定的任务。

存储过程可以包含流程控制、循环结构、条件判断等逻辑,还可以接受参数并返回结果。

存储过程的好处在于可以实现代码复用,提高数据库的性能和可维护性。

通过存储过程,我们可以将常用的SQL操作封装起来,减少了网络传输的开销,提高了数据访问的效率。

另外,存储过程还可以实现权限控制,通过调用存储过程来间接访问数据库,可以避免直接在应用程序中操作数据库,增强了数据的安全性。

最后,我们来了解一下触发器。

触发器是在数据库中特定的事件发生时自动执行的一段代码。

这些事件可以是INSERT、UPDATE或者DELETE操作。

触发器通常被用来在数据库表的数据发生变化时执行相应的操作。

它可以用来保证数据库的数据一致性和完整性,触发器能够在数据被修改之前或之后自动执行,并且可以在代码中加入逻辑判断和业务处理。

例如,在一个订单表中,我们可以定义一个触发器,在插入一条新订单数据时,自动计算订单总金额并更新到订单的总金额字段中。

总结一下,游标、存储过程和触发器是对数据库进行处理和控制的重要工具。

游标可以让我们逐行处理查询结果集,存储过程可以定义逻辑处理、实现代码的复用,而触发器则可以在数据库表的特定事件发生时自动执行一段代码。

数据库中的游标与存储过程优化

数据库中的游标与存储过程优化

数据库中的游标与存储过程优化引言在今天的信息时代,数据被认为是最重要的资产之一。

对于企业来说,对数据的存储和管理至关重要。

数据库是一种被广泛使用的数据存储和管理系统,它提供了一种结构化方式来有效地组织和检索数据。

然而,在处理大量数据时,数据库的性能可能成为瓶颈。

本文将讨论数据库中的游标和存储过程的优化技巧,以提高数据库的性能。

第一部分:数据库游标的优化1. 游标的概念和用途游标是一种在数据库中对结果集进行定位和遍历的手段。

它可以逐行处理结果集,并允许在结果集中执行增删改查操作。

游标提供了一个灵活的方式来处理复杂的数据操作。

然而,不正确使用游标可能会导致数据库性能下降。

2. 避免使用不必要的游标在编写存储过程或查询时,需要仔细考虑是否真正需要使用游标。

过多的游标会增加数据库的负载和开销。

如果可以使用其他方式来实现相同的目的,如使用集合或连接查询,应尽量避免使用游标。

3. 使用静态游标在游标的类型中,静态游标是最快的。

静态游标在检索结果集之前会将结果集整体获取到客户端,并将其缓存在内存中。

这样可以避免每次获取一个记录的延迟。

因此,如果结果集不是很大,并且可以全部缓存在内存中,使用静态游标可以提高性能。

4. 使用适当的游标选项游标有多个选项可以配置,以满足不同的需求。

例如,设置游标的敏感度可以控制对结果集的修改是否立即反映在游标的遍历中。

另外,设置游标的锁定类型可以控制对结果集的并发访问控制。

通过正确配置这些选项,可以提高游标的性能和并发处理能力。

第二部分:存储过程的优化1. 存储过程的基本原则存储过程是一组预定义的数据库操作步骤。

它们常用于封装复杂的业务逻辑,并通过减少网络通信来提高性能。

然而,存储过程的性能也受到多个因素的影响。

优化存储过程需要遵循一些基本原则。

2. 避免频繁的存储过程调用存储过程的调用涉及网络通信和数据库连接的开销。

如果频繁地调用存储过程,则会增加这些开销,降低性能。

因此,应当尽量减少存储过程的调用次数。

数据库实验十二--游标与存储过程

数据库实验十二--游标与存储过程

实验九游标与存储过程1 实验目的与要求(1) 掌握游标的定义和使用方法。

(2) 掌握存储过程的定义、执行和调用方法。

(3) 掌握游标和存储过程的综合应用方法。

2 实验内容请完成以下实验内容:(1) 创建游标,逐行显示Customer表的记录,并用WHILE结构来测试@@Fetch_Status 的返回值。

输出格式如下:'客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码' declare @cno char(9),@cname varchar(20),@tele varchar(20),@addr varchar(12),@zi char(7)declare @text varchar(180)declare cus_cur scroll cursor forselect customerNo,customerName,telephone,address,zipfrom customerorder by customerNoset@text='===============================customer======================= ====================='print @textset @text='客户编号'+' '+'客户名称'+' '+'客户电话'+' '+'客户住址'+' '+'邮政编码'print @textopen cus_curfetch cus_cur into @cno,@cname,@tele,@addr,@ziwhile(@@fetch_status=0)beginset @text = @cno+' '+@cname+''+space(2*(9-len(@cname)))+@tele+' '+@addr+' '+@ziprint @textfetch cus_cur into @cno,@cname,@tele,@addr,@ziendclose cus_curdeallocate cus_cur(2) 利用游标修改OrderMaster表中orderSum的值。

Oracle 12c数据库基础教程-Oracle 12c数据库游标、存储过程和触发器

Oracle 12c数据库基础教程-Oracle 12c数据库游标、存储过程和触发器

运行结果为:
人事部 PL/SQL 过程已成功完成。
10.1.2 游标控制语句
1.声明游标语句CURSOR 2.打开游标语句OPEN 3.游标取值语句FETCH 4.关闭游标语句CLOSE
1.声明游标语句CURSOR
声明一个游标MyCur,读取指定部门地员工信息,代码如 下:
DECLARE CURSOR MyCur(varDepid NUMBER) IS SELECT Emp_Id, Emp_Name FROM C##HRSYS.Employees WHERE Dep_id = varDepid;
10.1.4 游标FOR循环
TYPE 记录类型名 IS RECORD ( 字段声明 [, 字段声明] …);
定义记录变量地方法与定义普通变量地方法相同
记录变量名 记录变量类型
【例10.11】 声明记录类型User_Record_Type与定义记 录变量var_UserRecord,代码如下:
TYPE User_Record_Type IS RECORD ( UserId erId%Type, UserName erName%Type);
END; --结束程序体
2.%FOUND属性与%NOTFOUND属性
%FOUND属性判断游标所在地行是否有效,如 果有效,则%FOUND于TRUE,否则%FOUND于 FALSE。
【例10.9】
使用%FOUND属性可以循环执行游标读取数据,请看下面地程序。
/* 打开显示模式 */ SET ServerOutput ON; DECLARE --开始声明部分
WHERE Dep_id = varDepid;
BEGIN --开始程序体 IF MyCur%ISOPEN = FALSE Then OPEN MyCur(1); -- 读取部门编号为1地员工记录 END IF; FETCH MyCur INTO varId, varName; --读取当前游标位置地数 据 WHILE MyCur%FOUND --如果当前游标有效,则执行循环 LOOP dbms_output.put_line('员工编号:' || varId ||', 姓名:' || varName); --显示读取地数据 FETCH MyCur INTO varId, varName; --读取当前游标位置地 数据 END LOOP; CLOSE MyCur; --关闭游标

存储、游标的简介及嵌套使用

存储、游标的简介及嵌套使用

存储、游标的简介及嵌套使⽤1.存储过程简介 ⼀个存储过程是⼀个可编程的函数,它在数据库中创建并保存。

它可以有SQL语句和⼀些特殊的控制结构组成。

当希望在不同的应⽤程序或平台上执⾏相同的函数,或者封装特定功能时,存储过程是⾮常有⽤的。

数据库中的存储过程可以看做是对编程中⾯向对象⽅法的模拟。

它允许控制数据的访问⽅式。

存储过程通常有以下优点: (1).存储过程增强了SQL语⾔的功能和灵活性。

存储过程可以⽤流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

(2).存储过程允许标准组件是编程。

存储过程被创建后,可以在程序中被多次调⽤,⽽不必重新编写该存储过程的SQL语句。

⽽且数据库专业⼈员可以随时对存储过程进⾏修改,对应⽤程序源代码毫⽆影响。

(3).存储过程能实现较快的执⾏速度。

如果某⼀操作包含⼤量的Transaction-SQL代码或分别被多次执⾏,那么存储过程要⽐批处理的执⾏速度快很多。

因为存储过程是预编译的。

在⾸次运⾏⼀个存储过程时查询,优化器对其进⾏分析优化,并且给出最终被存储在系统表中的执⾏计划。

⽽批处理的Transaction-SQL语句在每次运⾏时都要进⾏编译和优化,速度相对要慢⼀些。

(4).存储过程能过减少⽹络流量。

针对同⼀个数据库对象的操作(如查询、修改),如果这⼀操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调⽤该存储过程时,⽹络中传送的只是该调⽤语句,从⽽⼤⼤增加了⽹络流量并降低了⽹络负载。

(5).存储过程可被作为⼀种安全机制来充分利⽤。

系统管理员通过执⾏某⼀存储过程的权限进⾏限制,能够实现对相应的数据的访问权限的限制,避免了⾮授权⽤户对数据的访问,保证了数据的安全。

2.存储过程简单实例1CREATE PROCEDURE `procedure_select_pay_success`() -- 创建存储过程2BEGIN-- 开始存储过程3SELECT*FROM ibsp_balance_account_data WHERE PAY_STATUS="2"; -- 调⽤的sql内容4END-- 结束存储过程56-- 调⽤存储过程7 CALL procedure_select_pay_success();89-- 删除存储过程10DROP PROCEDURE procedure_select_pay_success;3.游标简介 游标实际上是⼀种能从包括多条数据记录的结果集中每次提取⼀条记录的机制。

数据库:存储过程和游标

数据库:存储过程和游标
32
数据库原理及应用-SQL DML
利用游标修改数据
【例3】使用游标更改课程信息。 USE student
GO DECLARE @vcredit int DECLARE course_cur CURSOR FOR SELECT Ccredit FROM course OPEN course_cur FETCH course_cur INTO @vcredit WHILE @@FETCH_STATUS = 0
数据库原理及应用-SQL DML
游标的定义
游标的组成(两部分):
游标结果集(Cursor Result Set) :定义 游标的SELECT语句返回的行的集合。 游标的位置(Cursor Position) 指向这个 集合中某一行的指针。
21
数据库原理及应用-SQL DML
游标的使用
使用DECLARE CURSOR语句声明游标 使用OPEN语句打开游标 使用FETCH INTO语句从游标中提取数据 不空 空否 空,即数据提取完毕 使用CLOSE语句关闭游标
16
数据库原理及应用-SQL DML
存储过程返回状态码
declare @code int
execute @code=stu_avg ’200215121’, @avg OUTPUT if @code ……
返回
17
数据库原理及应用-SQL DML
存储过程与触发器对比
存储过程是SQL语句和可选控制流语句的
存储过程的特点
确保数据访问和操作的一致性,提高应用程 序的可维护性; 提高系统的执行效率;
提供一种安全机制;
减少了网络的流量负载;
若要改变业务规则或策略,只需改变存储过 程和参数,不必改应用程序。

数据库原理及应用知识点整理——存储过程与游标

数据库原理及应用知识点整理——存储过程与游标

存储过程与游标存储过程一、存储过程的概念1、概念:是存储在数据库中的一种编译对象,是一组完成特定功能的SQL语句集,编译后存储在数据库中,可以被客户机管理工具、应用程序和其他存储过程调用。

2、存储过程的主要优点:封装性、可增强SQL语句的功能和灵活性、可减少网络流量、高性能、提高数据库的安全性和数据的完整性二、创建存储过程的语法1、创建存储过程:CREATE PROCEDURE 存储过程名(参数1,参数2,……)BEGIN存储过程体END存储过程名以“proc_”为前缀或以“_proc”为后缀。

没有参数也要写括号,括号内包含多个参数时格式为:[ in | out | inout ] 参数名参数类型,分别对应输入参数(作为执行条件)、输出参数(用于存放存储过程执行完需要返回的操作结果)、输入/输出参数(二者皆可)注意:参数的取名不要与数据表的字段名相同,会报错。

2、存储过程体常用语法有declater声明局部变量、set为局部变量赋值、select…into加班费查询到的值直接存储到局部变量中、定义错误处理程序、使用流程控制语句实现复杂业务逻辑、使用游标。

3、declter 变量名数据类型 default ‘’;4、set 变量名 = 变量初始值;5、select 指定列名[ ] into 指定要复制的变量名[ ] select 语句中的from子句及后面的条件语句部分。

三、定义错误触发条件和错误处理程序(作用:提高语言的安全性)1、定义错误处理程序:(1)定义错误触发条件:方法一:使用sqlstate_value (长度为5的字符串类型的错误代码)DECLARE 异常名称 CONDITION FOR SQLSTATE ‘’;方法二:使用mysql_error_code(数值类型错误代码)DECLARE 异常名称 CONDITION FOR 值;(2)定义错误处理程序:DECLARE CONTINUE | EXIT | UNDO HANDLER FOR 错误类型[…] 一些存储过程或函数的执行语句CONTINUE 表示遇到错误不处理,继续执行;EXIT 表示遇到错误马上退出;UNDO 表示遇到错误后撤回之前的操作,MySQL 暂不执行这种处理方式。

Oracle 的存储过程及游标

Oracle 的存储过程及游标

Oracle 的存储过程及游标Oracle中的存储过程和游标:select myFunc(参数1,参数2..) to dual; --可以执行一些业务逻辑一:Oracle中的函数与存储过程的区别:A:函数必须有返回值,而过程没有.B:函数可以单独执行.而过程必须通过execute执行.C:函数可以嵌入到SQL语句中执行.而过程不行.其实我们可以将比较复杂的查询写成函数.然后到存储过程中去调用这些函数. 二:如何创建存储过程:A:格式create or replace procedure <porcedure_name>[(参数名参数类型以及描述,....)] ---注意,没有返回值is[变量声明]begin[过程处理];----------null;exceptionwhen 异常名 thenend;注意:参数中默认是按值传递.是in方式.也可以是out和in out方式.这些特点和函数一样.B:举例1:create or replace procedure myPro----create or replace proc myPro 出错不能简写(a in int:=0,b in int:=0)isc int:=0;beginc:=a+b;dbms_output.put_line('C is value'||c);end;执行:execute myPro(10,20); ---在Sql Server中.执行存储过程是不需要括弧的.注意分号不要调了.exec myPro(10,20); --可以简写C:举例2:如果在一个函数里面包含Select语句的话,那么该Select语句必须有into,过程同样也需要.create or replace procedure myPro1(a int:=0,b int:=0)isc int:=0;beginselect empno+a+b into c from emp where ename='FORD';dbms_output.put_line('C is values '||c);end;执行:execute myPro1(10,20)D:假如在一个过程里面要返回一个结果集,怎么办?大家注意.就必须要用到游标了!用游标来处理这个结果集.create or replace procedure Test(varEmpName emp.ename%type)is begin ------会报错.错误原因没有into子句.select * from emp where ename like '%'||varEmpName||'%';end;这个程序我们无法用into,因为在Oracle里面没有一个类型去接受一个结果集.这个时候我们可以声明游标对象去接受他.PL/SQL游标:A:分类:1:隐式游标:非用户明确声明而产生的游标. 你根本看不到cursor这个关键字.2:显示游标:用户明确通过cursor关键字来声明的游标.B:什么是隐式游标:1:什么时候产生:会在执行任何合法的SQL语句(DML---INSERT UPDATE DELETE DQL-----SELECT)中产生.他不一定存放数据.也有可能存放记录集所影响的行数.如果执行SELECT语句,这个时候游标会存放数据.如果执行INSERT UPDATE DELETE会存放记录影响的行数.C:隐式游标叫什么名字:名字叫sql关于sql的游标变量到底有哪些呢?作用:返回最近一次执行SQL语句所涉及的游标相关信息.因为每执行一次SQL 语句,都会产生一个隐式游标.那么当前执行的SQL语句就是当前的隐式游标. sql%foundsql%notfoundsql%rowcountsql%isopenD:关于隐式游标的例子:create table 学生基本信息表(StuID int,StuName varchar2(20))alter table 学生基本信息表 add constraint PK_STUID primary key(StuID)declarenum int:=0;beginnum:=&num;delete from 学生基本信息表 where StuID=num;if sql%notfound thendbms_output.put_line('该行数据没有发现');elsedbms_output.put_line('数据被发现并删除,影响的行数为:'||sql%rowcount);end if;end;E:关于显示游标的例子:1:如何定义显示游标declare cursor <cursor_name> is [select语句];declare cursor mycur is select empno,ename,job from scott.emp;2:如何打开游标:open <cursor_name>;open mycur;3:如何通过游标来读取数据fetch <cursor_name> into <variable_list>4:如何关闭游标:close <cursor_name>;close mycur;注意:在Oracle中,不需要显示销毁游标.因为在Oracle中,很多东西是由JAVA 写的.Oracle会自动销毁游标.5:举例:declarecursor mycur is select empno,ename,job from emp;vempno emp.empno%type;vename emp.ename%type;vjob emp.job%type;beginopen mycur;fetch mycur into vempno,vename,vjob;dbms_output.put_line('I Found You!'||mycur%rowcount||'行');dbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob); close mycur;end;因为只读出来一条,所以要遍历一下:declarecursor mycur is select empno,ename,job from emp;vempno emp.empno%type;vename emp.ename%type;vjob emp.job%type;beginopen mycur;loopfetch mycur into vempno,vename,vjob;exit when mycur%notfound;if mycur%found thendbms_output.put_line('读取的数据为'||vempno||' '||vename||' '||vjob); end if;end loop;dbms_output.put_line('I Found You!'||mycur%rowcount||'行');close mycur;end;6:通常情况下我们在读取表数据的时候,我们需要动态的去查询.所以能不能在Oracle中给游标带参数呢?可以!1):如何定义带参数的游标:declare cursor <cursor_name>(参数名称参数类型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???;2):例子:游标是一个集合,读取数据有两种方式第一种方式: open fetch close第二种方式: for 一但使用了for循环在循环刚刚开始的时候,相当于执行open,在处理循环的时候,相当于执行fetch,在退出循环的时候,相当于执行了closedeclarecursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%';beginfor line in query('A')loopdbms_output.put_line(line.empno||' '||line.ename||' '||line.job);end loop;end;实现动态输入:declarecursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%';name1 varchar(10);beginname1:=upper('&name1');for line in query(name1)loopdbms_output.put_line(line.empno||' '||line.ename||' '||line.job); end loop;end;。

游标与存储过程

游标与存储过程

Байду номын сангаас
存储过程
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。应用程序需要用的时候直接调用就可以了,所以效率会高。 存储过程介绍 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE中,若干个有联系的过程可以组合在一起构成程序包。 使用存储过程有以下的优点: * 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。 * 可保证数据的安全性和完整性。 # 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。 # 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。 * 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。 * 可以降低网络的通信量。 * 使体现企业规则的运算程序放入数据库服务器中,以便: # 集中控制。 # 当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。 数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。 利用SQL的语言可以编写对于数据库访问的存储过程,其语法如下: CREATE PROC[EDURE] procedure_name [;number] [ {@parameter data_type} ][VARYING] [= default] [OUTPUT] ] [,...n] [WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ] [FOR REPLICATION] AS sql_statement [...n] [ ]内的内容是可选项,而()内的内容是必选项, 例: 若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为: Create Proc select_del As Delete tmp 例:用户想查询tmp表中某年的数据的存储过程 create proc select_query @year int as select * from tmp where year=@year 在这里@year是存储过程的参数 例:该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。 空:表示该结点为顶层结点 fjdid(父结点编号) 结点n 非空:表示该结点的父亲结点号 dwmc(单位名称) CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output as declare @stop int declare @result varchar(80) declare @dwmc varchar(80) declare @dwid int set nocount on set @stop=1 set @dwmc="" select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold set @result=rtrim(@dwmc) if @dwid=0 set @stop=0 while (@stop=1) and (@dwid<>0) begin set @dwidold=@dwid select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold if @@rowcount=0 set @dwmc="" else set @result=@dwmc+@result if (@dwid=0) or (@@rowcount=0) set @stop=0 else continue end set @dwmcresult=rtrim(@result) 使用exec pro-name [pram1 pram2.....]

存储过程、触发器和游标

存储过程、触发器和游标

存储过程、触发器和游标
1.4执行存储过程
EXECUTE命令。
如果被调用的存储过程需要参数输入时,在存储 过程名后逐一给定,每一个参数用逗号隔开,不 必使用括号。
如果没有使用@参数名=default这种方式传入值,则参
数的排列必须和建立存储过程所定义的次序对应。
用来接受输出值的参数则必须加上OUTPUT。
存储过程、触发器和游标
1.1 存储过程概述 一般来讲,应使用SQL Server中的存储过程而 不使用存储在客户计算机本地的 T-SQL 程序, 其优势主要表现在: (1)允许模块化程序设计。 (2)允许更快速地执行。 (3)减少网络流量。 (4)可作为安全机制使用。
存储过程、触发器和游标
存储过程、触发器和游标
目标:
了解存储过程的优点 掌握如何创建存储过程(参数、返回值) 掌握如何调用存储过程 了解为什么需要触发器 理解触发器的工作原理 掌握如何使用inserted表和deleted表 掌握如何创建: INSERT触发器 UPDATE触发器 DELETE触发器 游标的基本更新 理解游标的使用步骤
存储过程、触发器和游标
1.3 创建存储过程
[例11-4]在仓库库存数据库创建带OUTPUT参数 的存储过程,用于计算指定的商品的平均价格, 存储过程中使用一个输入参数(商品名)和一个 输出参数(平均价格)。 CREATE PROCEDURE Pname @p_n varchar(20), @aveage int OUTPUT AS SELECT @aveage= avg(单价) FROM 商品 WHERE 商品名称=@p_n
存储过程、触发器和游标
1.3 创建存储过程

MySQL中的游标与存储过程调用

MySQL中的游标与存储过程调用

MySQL中的游标与存储过程调用MySQL是一种广泛使用的关系型数据库管理系统,它提供了丰富的功能和灵活的操作方式,使得开发者可以更好地处理和存储数据。

在MySQL中,游标和存储过程是两个重要的概念,它们可以帮助开发者更好地管理和操作数据。

本文将重点介绍MySQL中的游标和存储过程调用,并探讨它们的用途和优势。

一、游标的概念与用途游标是一个指向查询结果集中特定位置的数据指针,可以通过游标来逐行访问查询结果集。

在MySQL中,游标提供了对查询结果的灵活处理方式,尤其适用于需要逐行处理数据的情况,如数据分析、数据报表等。

通过游标,开发者可以逐条检索、更新和删除查询结果。

在使用游标之前,我们首先需要创建游标,并将其与查询结果绑定。

下面是一个简单示例:DECLARE cur CURSOR FOR SELECT * FROM students;在以上示例中,我们声明了一个名为cur的游标,并绑定了查询语句"SELECT * FROM students"。

创建游标后,我们可以通过FETCH语句逐行获取查询结果,并对数据进行处理。

例如:FETCH cur INTO @id, @name, @age;通过以上FETCH语句,我们将查询结果的每一行数据分别存储到变量@id、@name和@age中,然后可以对这些变量进行后续操作。

除了逐行获取查询结果,游标还可以用于循环处理数据。

例如,我们可以使用WHILE语句结合游标实现遍历查询结果的功能。

示例如下:WHILE (condition) DO...FETCH cur INTO ......END WHILE;通过以上WHILE语句与FETCH语句的组合,我们可以在循环中逐行处理查询结果,实现对数据的灵活操作。

二、存储过程调用的概念与用途存储过程是一组预定义的SQL语句集合,用于实现特定的功能。

与常规的SQL语句相比,存储过程具有以下优势:1. 重用性:存储过程可以在多个地方调用,减少了重复编写代码的工作量。

数据库系统原理实验: 存储过程与游标

数据库系统原理实验: 存储过程与游标

实验七 T-SQL程序设计与游标设计一、实验目的1.掌握Transact-SQL语言极其程序设计的方法;2.掌握T-SQL游标的使用方法。

二、实验内容与要求1.T-SQL程序设计逻辑Transact-SQL是SQL Server对标准SQL语言的扩充。

Transact-SQL是SQL Server对标准sQI.语言的扩充。

它引入了程序设计的思想,增加了程序的流程控制语句。

Transact-SQL语言最主要的用途是设计服务器端的能够在后台执行的程序块,如存储过程、触发器等。

(1)变量Transact-SQL中可以使用两种变量:局部变量和全局变量。

局部变量。

局部变量是用户可自行定义的变量,它的作用范围是在程序内部,一般用来存储从表中查询到的数据,或作为程序执行过程中的暂存变量。

局部变量必须以@开头,且必须先用DECLARE命令加以说明后才可使用。

全局变量。

全局变量是SQL Server系统内部使用的变量,其作用范围并不局限于某一程序,而是所有程序都可随时调用。

全局变量通常存储一些SQL Server的配置设定值和效能统计数据。

引用全局变量必须以@@开头。

(2)流程控制命令BEGIN…ENDIF…ELSE…CASEWHILE…CONTINUE…BREAKWAITFORGOTORETURN(3)其他命令BACKUP.CHECKPOINT.DBCC.DECLARE.EXECUTE.KILL.PRINT.RAISERROR.READTEXT.RESTORE.SELECT.SET.SHUTDOWi\l.WRITETEXT.USE.(4)常用函数统计函数算术函数字符串函数数据类型转换函数日期函数TEXT函数和IMAGE函数用户自定义函数1.1计算1—100之间所有能被3整除的数的个数和总和(1)启动SSMS。

(2)创建T-SQL程序:在查询编辑器窗口中输入下列程序:DECLARE @SUM SMALLINT, @I SMALLINT, @NUMS SMALLINTSET @SUM=0SET @I=1SET @NUMS=0WHILE (@I<=100)BEGINIF (@I%3=0 )BEGINSET @SUM=@SUM+@ISET @NUMS=@NUMS+1ENDSET @I=@I+1ENDPRINT '总和是:' + STR( @SUM )PRINT '个数是:' + STR( @NUMS )(3)执行T-SQL,执行结果如图1-1所示。

游标,存储过程

游标,存储过程

游标,存储过程1.1什么是游标⽤于临时存储⼀个查询返回的多⾏数据(结果集,类似于java的jdbc连接返回的ResultSet集合),通过遍历游标,可以逐⾏访问处理该结果集的数据.游标的使⽤⽅式: 声明---打开--读取---关闭1.2语法游标声明:CURSOR 游标名(参数列表) IS 查询语句;游标的打开:OPEN 游标名游标的取值:FETCH 游标名 INTO 变量列表游标的关闭:CLOSE 游标名1.3游标的属性游标的属性返回值类型说明%ROWCOUNT整型获取FETCH语句返回的数据⾏数%FOUND布尔型最近的FETCH语句返回⼀⾏数据则为真,否则为加%NOTFOUND布尔型与%FOUND属性返回值相反%ISOPEN布尔型游标已经打开时值为真,否则为假其中%NOTFOUND是在游标中找不到元素的时候返回TRUE,通常⽤来判断退出循环1.4创建和使⽤⽰例:使⽤游标查询emp表中的所有员⼯的姓名和⼯资,并将其依次打印出来-- 使⽤游标查询emp表中的所有员⼯的姓名和⼯资,并将其依次打印出来declare-- 声明游标 CURSOR 游标名(参数列表) IS 查询语句;CURSOR c_emp IS select ename,sal FROM emp;--声明变量接收游标中的数据v_ename emp.ename%TYPE;v_sal emp.sal%TYPE;begin-- 打开游标OPEN c_emp;--遍历游标LOOP--获取游标中的数据如果有的话赋值给变量FETCH c_emp INTO v_ename,v_sal;EXIT WHEN c_emp%NOTFOUND;dbms_output.put_line('姓名:'||v_ename||',薪⽔:'||v_sal);END LOOP;--关闭游标CLOSE c_emp;end;1.5带参数的游标⽰例:使⽤游标查询并打印某部门的员⼯的姓名和薪资,部门编号为运⾏时⼿动输⼊.-- 使⽤游标查询并打印某部门的员⼯的姓名和薪资,部门编号为运⾏时⼿动输⼊.declare-- 声明游标 CURSOR 游标名(参数列表) IS 查询语句;CURSOR c_emp(v_deptno emp.deptno%TYPE) ISselect ename,sal FROM emp where deptno=v_deptno;--声明变量接收游标中的数据v_ename emp.ename%TYPE;v_sal emp.sal%TYPE;begin-- 打开游标OPEN c_emp(20);--遍历游标LOOP--获取游标中的数据如果有的话赋值给变量FETCH c_emp INTO v_ename,v_sal;EXIT WHEN c_emp%NOTFOUND;dbms_output.put_line('姓名:'||v_ename||',薪⽔:'||v_sal);END LOOP;--关闭游标CLOSE c_emp;end; 给对应级别的员⼯涨⼯资,key是empno-- 给对应级别的员⼯涨⼯资,key是empnodeclare-- 声明光标cursor cemp isselect empno,job from emp;--声明变量接收光标数据pempno emp.empno%TYPE;pempjob emp.job%TYPE;begin-- 事务回滚rollback;--打开光标open cemp;loop--遍历光标取出⼀个员⼯fetch cemp into pempno,pempjob;--退出条件exit when cemp%notfound;--判断员⼯的职位if pempjob='PRESIDENT' then update emp set sal=sal+1000 where empno=pempno;-- if condition then block ;elsif condition then block;else block;end if;elsif pempjob='MANAGER' then update emp set sal=sal+800 where empno=pempno;else update emp set sal=sal+400 where empno=pempno;end if;end loop;--关闭光标close cemp;-- oracle的默认事务隔离级别是read committed--事务的ACID 原⼦性、⼀致性、隔离性、持久性commit;end;存储过程和存储函数数据库存储过程:指存储在数据库中供所有⽤户程序调⽤的⼦程序叫存储过程、存储函数·相同点:完成特定功能的程序·不同点:是否⽤return语句返回值。

游标,存储过程,触发器的区别与使用

游标,存储过程,触发器的区别与使用

游标,存储过程,触发器的区别与使⽤⼀、游标*什么是游标游标实际上是⼀种能从包括多条数据记录的结果集(结果集是select查询之后返回的所有⾏数据的集合)中每次提取⼀条记录的机制充当指针的作⽤,遍历结果中的所有⾏,但他⼀次只指向⼀⾏。

游标的结果集是由SELECT语句产⽣,如果处理过程需要重复使⽤⼀个记录集,那么创建⼀次游标⽽重复使⽤若⼲次,⽐重复查询数据库要快的多。

也可以说,SQL的游标是⼀种临时的数据库对象,可以⽤来存放在数据库表中的数据⾏副本,也可以指向存储在数据库中的数据⾏的指针。

游标提供了在逐⾏的基础上操作表中数据的⽅法。

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

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

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

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

*不⾜:数据量⼩时才使⽤游标,因为:1.游标使⽤时会对⾏加锁,系统上跑的不只我们⼀个业务,这就会影响其他业务的正常进⾏;2.数据量⼤时其效率也较低效;3.游标其实是相当于把磁盘数据整体放⼊了内存中,如果游标数据量⼤则会造成内存不⾜,书写格式:DECLARE mycursor Cursor --定义游标FOR SELECT EmployeeID FROM ... --查询语句OPEN mycursor --打开游标DECLARE @id int --根据查询语句相应地定义变量FETCH NEXT FROM mycursor INTO @id --逐⾏提取游标集中的⾏WHILE @@FETCH_STATUS=0 --通过检查全局变量@@FETCH_STATUS来判断是否已读完游标集中所有⾏BEGIN*此处书写要执⾏的Sql语句*FETCH NEXT FROM mycursor INTO @id --移动游标ENDCLOSE mycursor --关闭游标DEALLOCATE mycursor --释放游标实例:根据产品名称(名称⼀样视为同⼀产品)统计该产品的销售数量,如果在统计表(ProductStatistics)中能找到这个产品名称的数据,则插⼊这个产品的统计结果,如果不能找到这个产品名称的数据,则修改统计结果。

mysql存储过程和游标

mysql存储过程和游标

-- 打开游标 OPEN cur_account; -- 遍历 read_loop: LOOP
-- 取值 取多个字段 FETCH NEXT from cur_account INTO itemId,AA,BB,CC;
IF done THEN
LEAVE read_loop;
END IF;
SET new_province = (SELECT Impcode FROM sys_area WHERE AreaID = AA);
--
EXECUTE stm;
--
DEALLOCATE PREPAR源自 stm;COMMIT;-- 提交
END LOOP;
CLOSE cur_account;
END
-- 执行更新
UPDATE startup_project_copy SET province = new_province, city= CONCAT(new_city,'000000'), area = CONCAT(new_area,'000000') WHERE id = itemId;
--
请求出错错误代码503请尝试刷新页面重试
mysql存 储 过 程 和 游 标
CREATE DEFINER=`root`@`localhost` PROCEDURE `NewProc`() BEGIN
#Routine body goes here... DECLARE itemId varchar(64); -- id DECLARE AA varchar(64); -- 省
SET @UPDATE = CONCAT('UPDATE startup_project_copy SET province =', new_province,', city=', new_city, ', area =', new_area, ' WHERE id = ',id);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验九游标与存储过程1 实验目的与要求(1) 掌握游标的定义和使用方法。

(2) 掌握存储过程的定义、执行和调用方法。

(3) 掌握游标和存储过程的综合应用方法。

2 实验内容请完成以下实验内容:(1) 创建游标,逐行显示Customer表的记录,并用WHILE结构来测试@@Fetch_Status 的返回值。

输出格式如下:'客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码' declare @cno char(9),@cname varchar(20),@tele varchar(20),@addr varchar(12),@zi char(7)declare @text varchar(180)declare cus_cur scroll cursor forselect customerNo,customerName,telephone,address,zipfrom customerorder by customerNoset@text='===============================customer======================= ====================='print @textset @text='客户编号'+' '+'客户名称'+' '+'客户电话'+' '+'客户住址'+' '+'邮政编码'print @textopen cus_curfetch cus_cur into @cno,@cname,@tele,@addr,@ziwhile(@@fetch_status=0)beginset @text = @cno+' '+@cname+''+space(2*(9-len(@cname)))+@tele+' '+@addr+' '+@ziprint @textfetch cus_cur into @cno,@cname,@tele,@addr,@ziendclose cus_curdeallocate cus_cur(2) 利用游标修改OrderMaster表中orderSum的值。

declare @no varchar(12),@sumprice varchar(10)declare @text varchar(100)declare cur_ordersum scroll cursor forselect orderNo,sum(quantity*price)from orderdetail odgroup by orderNoopen cur_ordersumfetch cur_ordersum into @no,@sumpricewhile(@@fetch_status=0)beginupdate ordermasterset ordersum = @sumpricewhere orderno=@nofetch cur_ordersum into @no,@sumpriceendclose cur_ordersumdeallocate cur_ordersumselect*from ordermaster(3) 创建游标,要求:输出所有女业务员的编号、姓名、性别、所属部门、职务、薪水。

declare @no varchar(12),@name varchar(4),@sex varchar(2),@dpvarchar(10),@hship varchar(8),@money numeric(7,2)declare @text varchar(50)declare cur_employee scroll cursor forselect employeeno,employeename,sex,department,headship,salaryfrom employeewhere sex='f'open cur_employeefetch cur_employee into @no,@name,@sex,@dp,@hship,@moneyprint'员工编号 '+'姓名 '+'性别'+'所属部门 '+'职务 '+'薪水'while(@@fetch_status=0)beginset@text =@no+' '+@name+space(6-2*len(@name))+@sex+' '+@dp+' '+@hship+' '+convert(char(9),@money)print @textfetch cur_employee into @no,@name,@sex,@dp,@hship,@moneyendclose cur_employeedeallocate cur_employee(4) 创建存储过程,要求:按表定义中的CHECK约束自动产生员工编号。

create procedure pro_employeeno @name varchar,@sex varchar,@birthday varchar,@address varchar,@telephone varchar,@hiredatevarchar,@department varchar,@headship varchar,@salary varcharasdeclare @y varchar,@countt int,@no varchardeclare cur_employeeno scroll cursor forselect year(hiredate),count(*)from employeegroup by year(hiredate)open cur_employeenofetch cur_employeeno into @y,@counttwhile(@@fetch_status=0)beginif(@y =convert(varchar,year(@hiredate)))beginif(@countt<9)set @no ='E'+@y+'00'+convert(varchar,@countt+1)else if(@countt<99)set @no ='E'+@y+'0'+convert(varchar,@countt+1)elseset @no ='E'+@y+convert(varchar,@countt+1)endfetch cur_employeeno into @y,@counttendinsert Employeevalues(@no,@name,@sex,@birthday,@address,@telephone,@hiredate,@depart ment,@headship,@salary)close cur_employeenodeallocate cur_employeeno(5) 创建存储过程,要求:查找姓“李”的职员的员工编号、订单编号、订单金额。

create procedure pro_employeeLiasselect employeeno,orderno,ordersumfrom employee e,ordermaster omwhere e.employeename like'李%'exec pro_employeeLi --结果有两张表?(6) 创建存储过程,要求:统计每个业务员的总销售业绩,显示业绩最好的前3位业务员的销售信息。

create procedure pro_employeetop3asselect top 3 temp.employeeno,sum(ordersum)hefrom(select employeeno,ordersumfrom employee e,ordermaster omwhere employeeno=salerno)tempgroup by temp.employeenoorder by he desc(7)创建存储过程,要求将大客户(销售数量位于前5名的客户)中热销的前3种商品的销售信息按如下格式输出:=======大客户中热销的前3种商品的销售信息================商品编号商品名称总销售数量P2******* 120GB硬盘 21.00P2******* 3.5寸软驱 18.00P2******* 网卡 16.00create procedure pro_producttop3asdeclare @no varchar(12),@name varchar(10),@he varchar(10)declare cur_producttop3 scroll cursor forselect top 3 od.productno 商品编号,productname 商品名称,sum(quantity)总量from ordermaster om,orderdetail od,product p,(select top 5 customerno,sum(quantity) hefrom orderdetail od,ordermaster omwhere od.orderno=om.ordernogroup by customernoorder by he desc) tempwhere om.customerno = temp.customernoand om.orderno = od.ordernoand p.productno = od.productnogroup by od.productno,productnameorder by总量descopen cur_producttop3fetch cur_producttop3 into @no,@name,@heprint'=======大客户中热销的前种商品的销售信息==============='print' 商品编号 '+'商品名称 '+'商品销售数量'while(@@fetch_status=0)beginprint' '+@no+' '+@name+space((16-len(@name)))+@hefetch cur_producttop3 into @no,@name,@heendclose cur_producttop3deallocate cur_producttop3(8) 创建存储过程,要求:输入年度,计算每个业务员的年终奖金。

相关文档
最新文档