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存储过程何循环读表。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)