MySQL 存储过程,获取使用游标查询的结果集

MySQL 存储过程,获取使用游标查询的结果集,第1张

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

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

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

方法一:Loop循环

调用存储过程:

方法二:While 循环

调用存储过程:

方法三:REPEAT 循环

调用存储过程:

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

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

解决方法:

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

DECLARE\x0d\@idINT,@valueVARCHAR(10);\x0d\BEGIN\x0d\--定义游标\x0d\DECLAREc_test_mainCURSORFAST_FORWARDFOR\x0d\SELECTid,valueFROMtest_main;\x0d\--打开游标\x0d\OPENc_test_main;\x0d\\x0d\WHILE1=1\x0d\BEGIN\x0d\--填充数据\x0d\FETCHNEXTFROMc_test_mainINTO@id,@value;\x0d\--假如未检索到数据,退出循环\x0d\IF@@fetch_status!=0BREAK;\x0d\\x0d\PRINT@value;\x0d\END;\x0d\\x0d\--关闭游标\x0d\CLOSEc_test_main;\x0d\--释放游标\x0d\DEALLOCATEc_test_main;\x0d\END;go

使用游标,如下

CREATE PROCEDURE proc_getalltable

AS

BEGIN

SET NOCOUNT ON;

DECLARE @tablename VARCHAR(100),@sql VARCHAR(1000)

DECLARE tablename CURSOR FOR SELECT tname FROM tablelist

OPEN tablename

FETCH NEXT FROM tablename INTO @tablename

WHILE @@FETCH_STATUS = 0

BEGIN

SELECT @sql = 'SELECT FROM ' + @tablename

EXEC(@sql)

FETCH NEXT FROM tablename INTO @tablename

END

CLOSE tablename

DEALLOCATE tablename

END

GO

测试表与测试数据

CREATE TABLE TestMulToOne (

  name       VARCHAR(10),

  allTitles  VARCHAR(200)

);

INSERT INTO TestMulToOne VALUES ('张三', '程序员,系统管理员,网络管理员');

INSERT INTO TestMulToOne VALUES ('李四', '项目经理,系统分析员');

   

 

DELIMITER //

DROP FUNCTION GetTextCount //

/

-- 获取字符串中有几个部分

/

CREATE FUNCTION GetTextCount(pSourceText  VARCHAR(255),  pDivChar  CHAR(1))

RETURNS TINYINT

BEGIN

 -- 预期结果 

 DECLARE vResult TINYINT;

 -- 当前逗号的位置

 DECLARE vIndex INT;

 -- 前一个逗号的位置

 DECLARE vPrevIndex INT;

 -- 结果的初始值

 SET vResult = 1;

 -- 查询第一个 逗号的位置

 SET vIndex = INSTR(pSourceText, pDivChar);

 IF vIndex = 0 THEN

  -- 参数中没有逗号,直接返回

  RETURN vResult;

 END IF;

 -- 初始化情况,前一个逗号不存在

 SET vPrevIndex = 0;

 -- 循环处理。

 WHILE vIndex > 0 DO

  -- 结果递增

  SET vResult = vResult + 1;  

  -- 前一个逗号的位置 = 当前逗号的位置

  SET vPrevIndex = vIndex;

  -- 查询下一个逗号的位置

  SET vIndex = LOCATE(pDivChar,  pSourceText,  vPrevIndex + 1);

 END WHILE;

 -- 返回结果

 RETURN vResult;

END;

//

 

DROP FUNCTION GetTextValue //

/

-- 获取字符串中具体某一个部分的数据

/

CREATE FUNCTION GetTextValue(pSourceText  VARCHAR(255),  pDivChar  CHAR(1), pIndex  TINYINT)

RETURNS VARCHAR(255) 

BEGIN

 -- 预期结果 

 DECLARE vResult VARCHAR(255);

 IF pIndex = 1 THEN

  SELECT SUBSTRING_INDEX(pSourceText,  pDivChar,  1)  INTO  vResult;

 ELSE

  SELECT 

   REPLACE(

    SUBSTRING_INDEX(pSourceText,  pDivChar,  pIndex),

    CONCAT(SUBSTRING_INDEX(pSourceText,  pDivChar,  pIndex - 1) , pDivChar),

    '') INTO  vResult;

 END IF;

 

 -- 返回

 RETURN vResult;

END;

//

DELIMITER ;

/

SELECT GetTextCount('程序员,系统管理员,网络管理员', ',') AS Co;

SELECT 

 GetTextValue('程序员,系统管理员,网络管理员', ',', 1) AS A,

 GetTextValue('程序员,系统管理员,网络管理员', ',', 2) AS B,

 GetTextValue('程序员,系统管理员,网络管理员', ',', 3) AS C;

/

   

SELECT

 tname,

 GetTextValue(tallTitles, ',', MaxNumNo) AS OneTitle

FROM

 TestMulToOne t,

 (SELECT 1 No UNION ALL

  SELECT 2 No UNION ALL

  SELECT 3 No UNION ALL

  SELECT 4 No UNION ALL

  SELECT 5 No ) MaxNum

WHERE

 GetTextCount(tallTitles, ',') >= MaxNumNo

ORDER BY

 tname;

 

+------+------------+

| name | OneTitle   |

+------+------------+

| 张三 | 系统管理员 |

| 张三 | 网络管理员 |

| 张三 | 程序员     |

| 李四 | 系统分析员 |

| 李四 | 项目经理   |

+------+------------+

5 rows in set (000 sec)

在数据库中,游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行 *** 作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标总是与一条SQL 查询语句相关联因为游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结果集中指向特定记录的游标位置组成。

我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的 *** 作,而不是一次对整个结果集进行同一种 *** 作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

以下实例用的是在存储过程中遍历结果和查询数据库中所有 存储过程名称 加以处理以文本形式输出:

create procedure findName--创建一个名为findName的存储过程  

AS

 declare @result VARCHAR(30)--用来处理结果的变量  

 begin  

 --声明一个游标  

  Declare curStudentFee Cursor for   

  SELECT NAME FROM SYSOBJECTS WHERE XTYPE='P';---查询语句(查询所有用户存储过程名称)  

    

   --打开游标  

  Open curStudentFee   

  --循环并提取记录  

  Fetch Next From curStudentFee Into @result--取第一条记录存入@result中  

  While ( @@Fetch_Status=0 )     

        begin  

        print ''''+@result+''''+',';---处理结果  

     Fetch Next From curStudentFee into @result----下一条  

       end   

  --关闭游标     

   Close curStudentFee

  --释放游标  

 Deallocate curStudentFee   

 end

实现循环有很多种方式 看你需要 或者喜欢

有for 循环

有while 循环

有foreach 循环

等等 我用的不是 sql sever数据库 具体的 你自己写写看

------------------------------------------------------------

SQL

SERVER数据库建立存储过程时,可以使用循环语句,下面就将为您介绍这种SQL SERVER数据库中存储过程使用循环语句的方法,供您参考。

CREAT PROCEDURE tester

AS

BEGIN

SET NOCOUNT ON;

DECLARE @userId varchar(50)

DECLARE @count int

SET @count =

0

SELECT @count = count() FROM UserService_User WHERE Account like

'%111%'

WHILE @count > 0

BEGIN

SELECT @userId = Id

FROM UserService_User WHERE Account like '%111%'

exec

UserService_RemoveUserByUserId @userId

SET @count = @count -1

END

END

说明:

1、此存储过程在SQL SERVER 2005上测试通过,值得注意的是,循环体中,语句是使用BEGIN……END包括的,而不是网络上常说的WHILE

……END WHILE结构,其他的循环语句,如LOOP ……UNTIL……END LOOP也不能通过编译,也许是版本的问题,但在SQL

SERVER2005中,循环体使用BEGIN……END就可以,而不能使用网络上常说的WHILE ……END WHILE结构。

2、循环体中 UserService_RemoveUserByUserId

是一个存储过程的名称,@userId为该存储过程的参数,如果有多个参数,使用“,”分开就可以了,这也是存储过程调用另一个存储过程的一种方法。

这个是我从网上百度的 希望对你有用

给你一个思路:

1:先查询数据库中有多少表放到一张表中

select indentity(int,1,1)name

into #a

from sysobjects where xtype='U'

2:

统计一共有多少张表,循环执行取得每张表的名字,

来查询表的记录数放到一张表b中

3:

查询存放记录的表

你先自己动手写写看,不会的话我在帮你写

以上就是关于MySQL 存储过程,获取使用游标查询的结果集全部的内容,包括:MySQL 存储过程,获取使用游标查询的结果集、sql server 存储过程如何对select语句的结果集进行循环 *** 作、sqlserver存储过程何循环读表。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/web/10144326.html

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

发表评论

登录后才能评论

评论列表(0条)

保存