mysql 临时表能不能作为游标

mysql 临时表能不能作为游标,第1张

游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种 *** 作,然后将 *** 作结果写回数据表中。

MySQL 存储过程中,使用游标查询,返回的是结果集时,如何查看调用存储过程输出结果呢?

解决方案:存储过程不返回数据,但它能创建和填充另一个表。所以在存储过程运行中创建临时表。该临时表将保存存储过程中生成的结果集,在遍历游标时,用insert保存每条数据到临时表中。后续调用时可以用select语句查询临时表中的存储过程运行结果。

以下有 三种方式 使用游标创建一个存储过程,统计某一部门下的员工信息

方法一:Loop循环

调用存储过程:

方法二:While 循环

调用存储过程:

方法三:REPEAT 循环

调用存储过程:

上述三种实现方法在测试过程中遇到下述问题。

调用存储过程查询临时表输出结果时,会发现多循环了一次,像这样:

解决方法:

在遍历游标查询结果时,先判断游标的结束标志(done) 是否是为1,如果不是1,则向临时表中插入数据。

给你写几个事例吧:

1:将雇员表中所有10部门的员工薪水+500,然后使用

隐式游标

判断有更新则输出更新的行数,否则提示没有更新记录。

begin

update

emp

set

sal=

sal+500

where

deptno

=

10

if

sql%found

then

dbms_output.put_line('表已更新')

dbms_output.put_line

('一共更新了

'||sql%rowcount||'

条记录')

else

dbms_output.put_line('没有更新记录')

end

if

end

--2、使用

显示游标

循环输出某部门所有员工的姓名,部门由参数传入游标。

declare

dno

number

cursor

emp_cur(dno

number)

is

select

*

from

emp

where

deptno=dno

begin

dbms_output.put_line('员工姓名'||'

'||'部门编号')

dno:=

'&请输入部门编号'

for

v_emp

in

emp_cur(dno)

loop

dbms_output.put_line(v_emp.ename||'

'||v_emp.deptno)

end

loop

end

--3、使用更新游标将雇员表中所有薪水2000以下的加1000,3000以下的加500,4000以上的删除。

declare

cursor

cur_emp

is

select

sal

from

emp

for

update

begin

for

v_emp

in

cur_emp

loop

if

v_emp.sal

<

2000

then

update

emp

set

sal

=

sal

+

1000

where

current

of

cur_emp

elsif

v_emp.sal

<

3000

then

update

emp

set

sal

=

sal

+

500

where

current

of

cur_emp

elsif

v_emp.sal

>

4000

then

delete

emp

where

current

of

cur_emp

end

if

end

loop

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6159547.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存