存储过程循环结果集
A. 在简单的游标中使用 FETCH
以下示例为 Person.Contact 表中姓氏以字母 B 开头的行声明了一个简单的游标,并使用 FETCH NEXT 逐个提取这些行。FETCH 语句以单行结果集形式返回在 DECLARE CURSOR 中指定的列的值。
USEAdventureWorks
GO
DECLAREcontact_cursorCURSORFOR
SELECTLastNameFROMPerson.Contact
WHERELastNameLIKE'B%'
ORDERBYLastName
OPENcontact_cursor
--Performthefirstfetch.
FETCHNEXTFROMcontact_cursor
--Check@@FETCH_.
WHILE@@FETCH_STATUS=0
BEGIN
--.
FETCHNEXTFROMcontact_cursor
END
CLOSEcontact_cursor
DEALLOCATEcontact_cursor
GO
B. 使用 FETCH 将值存入变量
以下示例与示例 A 相似,但 FETCH 语句的输出存储于局部变量而不是直接返回到客户端。PRINT 语句将变量组合成单一字符串并将其返回到客户端。
USEAdventureWorks
GO
--.
DECLARE@LastNamevarchar(50),@FirstNamevarchar(50)
DECLAREcontact_cursorCURSORFOR
SELECTLastName,FirstNameFROMPerson.Contact
WHERELastNameLIKE'B%'
ORDERBYLastName,FirstName
OPENcontact_cursor
--.
--Note:
--intheSELECTstatement.
FETCHNEXTFROMcontact_cursor
INTO@LastName,@FirstName
--Check@@FETCH_.
WHILE@@FETCH_STATUS=0
BEGIN
--.
PRINT'ContactName:'+@FirstName+''+@LastName
--.
FETCHNEXTFROMcontact_cursor
INTO@LastName,@FirstName
END
CLOSEcontact_cursor
DEALLOCATEcontact_cursor
GO
‘贰’ 怎样得到mysql存储过程多条语句的结果集
存储过程经常需要返回多个结果集。 Mysql 中直接用 select 即可返回结果集。而 oracle 则需要使用游标来返回结 果 集。这一点 Mysql 相对比较方便,如下代码即可实现输出两个结果集:
CREATE PROCEDURE test_proc_multi_select()
BEGIN
select * from testproc;
select * from testproc where id=1;
END;
java 中利用循环,即可获取结果集数据:
con = MConnection.getConn();
String sql = "{call test_proc_multi_select()}";
cs = con.prepareCall(sql);
boolean hadResults = cs.execute();
int i = 0;
while (hadResults) {
System.out.println("result No:----" + (++i));
ResultSet rs = cs.getResultSet();
while (rs != null && rs.next()) {
int id1 = rs.getInt(1);
String name1 = rs.getString(2);
System.out.println(id1 + ":" + name1);
}
hadResults = cs.getMoreResults(); // 检查是否存在更多结果集
}
‘叁’ oracle存储过程中循环查询返回多个结果集怎么集合在一起
你可以先把数据集保存到array里面,完了之后再用一次性的导出来。
又或者你可以检查你的循环查询,是否能用一条sql来完成。
‘肆’ mysql 创建存储过程中用到循环,怎么通过select返回结果集
测试表与测试数据
CREATETABLETestMulToOne(
nameVARCHAR(10),
allTitlesVARCHAR(200)
);
INSERTINTOTestMulToOneVALUES('张三','程序员,系统管理员,网络管理员');
INSERTINTOTestMulToOneVALUES('李四','项目经理,系统分析员');
DELIMITER//
DROPFUNCTIONGetTextCount//
/**********
--获取字符串中有几个部分.
**********/
CREATEFUNCTIONGetTextCount(pSourceTextVARCHAR(255),pDivCharCHAR(1))
RETURNSTINYINT
BEGIN
--预期结果.
DECLAREvResultTINYINT;
--当前逗号的位置.
DECLAREvIndexINT;
--前一个逗号的位置.
DECLAREvPrevIndexINT;
--结果的初始值.
SETvResult=1;
--查询第一个逗号的位置.
SETvIndex=INSTR(pSourceText,pDivChar);
IFvIndex=0THEN
--参数中没有逗号,直接返回.
RETURNvResult;
ENDIF;
--初始化情况,前一个逗号不存在.
SETvPrevIndex=0;
--循环处理。
WHILEvIndex>0DO
--结果递增.
SETvResult=vResult+1;
--前一个逗号的位置=当前逗号的位置
SETvPrevIndex=vIndex;
--查询下一个逗号的位置.
SETvIndex=LOCATE(pDivChar,pSourceText,vPrevIndex+1);
ENDWHILE;
--返回结果.
RETURNvResult;
END;
//
DROPFUNCTIONGetTextValue//
/**********
--获取字符串中具体某一个部分的数据.
**********/
CREATEFUNCTIONGetTextValue(pSourceTextVARCHAR(255),pDivCharCHAR(1),pIndexTINYINT)
RETURNSVARCHAR(255)
BEGIN
--预期结果.
DECLAREvResultVARCHAR(255);
IFpIndex=1THEN
SELECTSUBSTRING_INDEX(pSourceText,pDivChar,1)INTOvResult;
ELSE
SELECT
REPLACE(
SUBSTRING_INDEX(pSourceText,pDivChar,pIndex),
CONCAT(SUBSTRING_INDEX(pSourceText,pDivChar,pIndex-1),pDivChar),
'')INTOvResult;
ENDIF;
--返回.
RETURNvResult;
END;
//
DELIMITER;
/*
SELECTGetTextCount('程序员,系统管理员,网络管理员',',')ASCo;
SELECT
GetTextValue('程序员,系统管理员,网络管理员',',',1)ASA,
GetTextValue('程序员,系统管理员,网络管理员',',',2)ASB,
GetTextValue('程序员,系统管理员,网络管理员',',',3)ASC;
*/SELECT
t.name,
GetTextValue(t.allTitles,',',MaxNum.No)ASOneTitle
FROM
TestMulToOnet,
(SELECT1NoUNIONALL
SELECT2NoUNIONALL
SELECT3NoUNIONALL
SELECT4NoUNIONALL
SELECT5No)MaxNum
WHERE
GetTextCount(t.allTitles,',')>=MaxNum.No
ORDERBY
t.name;
+------+------------+
|name|OneTitle|
+------+------------+
|张三|系统管理员|
|张三|网络管理员|
|张三|程序员|
|李四|系统分析员|
|李四|项目经理|
+------+------------+
5rowsinset(0.00sec)
‘伍’ oracle存储过程中循环查询返回多个结果集怎么集合在一起_
利用游标将查询结果插入到一个表里!
或者存储到定义的数组中!
‘陆’ oracle存储过程中循环查询返回多个结果集怎么集合在一起
返回结果集合成什么样?
一条记录直接输出?
你可以把返回的结果插到一张表里,然后去看不就行了吗?
你可以把每次查询,改成每次插入一张表里,回过头再看结果集
‘柒’ MYSQL如何把存储过程所返回的结果集插入到表
从存储过程返回表类型的值也有二种:
1.存储过程使用浮标参数,即同时指定CURSOR VARYING OUTPUT项.调用者可以使用while及fetch循环遍历该浮标.
2.直接将存储过程返回的结果集插入到表中,即使用insert into 表名 exec 存储过程.此种方式中注意存储过程返回的结果集列与insert的列要完全对应,可以在insert中指定列名来保证对应关系.
------------------------------------------------------------------------------测试:------------------------------------------------------------------------------
----建立测试用的临时表
create table #tmp (colx int,coly int)
insert into #tmp values(1,2)
insert into #tmp values(2,3)
insert into #tmp values(3,4)
select * from #tmpGO----创建返回游标的存储过程
create proc sp_c @cur CURSOR VARYING OUTPUTASbeginset @cur = CURSOR for select colx from #tmp
open @cur /*该过程返回游标,该游标为colx列的查询结果*/endGO----创建返回表的存储过程
create proc sp_dasselect coly from #tmp /*该过程返回coly列的查询结果*/go----创建用于调用以上二个存储过程的存储过程
create proc sp_easbegindeclare @x int
declare @cur cursor
----接收游标,并遍历游标
EXEC sp_c @cur OUTPUT
fetch next from @cur into @x
while (@@FETCH_STATUS = 0)beginprint @xfetch next from @cur into @xENDclose @curdeallocate @cur
----将存储过程返回的列值再重新插入源表中
‘捌’ sql server 存储过程如何对select语句的结果集进行循环操作
DECLARE
@id INT, @value VARCHAR(10);
BEGIN
-- 定义游标.
DECLARE c_test_main CURSOR FAST_FORWARD FOR
SELECT id,valueFROM test_main;
-- 打开游标.
OPEN c_test_main;
WHILE 1=1
BEGIN
-- 填充数据.
FETCH NEXT FROM c_test_main INTO @id, @value;
-- 假如未检索到数据,退出循环.
IF@@fetch_status!= 0 BREAK;
PRINT @value;
END;
-- 关闭游标
CLOSE c_test_main;
-- 释放游标.
DEALLOCATE c_test_main;
END;go
‘玖’ sqlserver 存储过程中循环遍历结果集
sql1=select * from (select *, row_number() over(order by username ) as rowNumber from users where regfrom='&admin&') as t where t.rowNumber > 0 and t.rowNumber <= 0 + 30 order by username
怎么会有27 条记录呢,除非你的表 一共就27条记录吧。
用游标或临时表
--游标
declare youbiao1 for 查询1
open youbiao1
fetch next from youbiao1 into 变量
while @@FETCH_STATUS = 0
begin
里面一次套用
end
--临时表
declare @ID int
set @ID = 1
while Exists(select * from 表)
begin
--处理
--
set @ID = @ID + 1
end
‘拾’ mysql 使用存储过程 循环查找数据
delimiter
$$
mysql>
mysql>
CREATE
PROCEDURE
myProc()
//创建while循环的存储过程
if分支语句示例
->
BEGIN
->
->
DECLARE
i
int;
->
SET
i=1;
->
loop1:
WHILE
i<=10
DO
->
IF
MOD(i,2)<>0
THEN
/*Even
number
-
try
again*/
->
SELECT
CONCAT(i,"
is
an
odd
number");
->
END
IF;
->
SET
i=i+1;
->
END
WHILE
loop1;
->
END$$
Query
OK,
0
rows
affected
(0.00
sec)
这种也可以