当前位置:首页 » 存储配置 » 存储过程循环结果集

存储过程循环结果集

发布时间: 2022-05-10 11:45:38

‘壹’ sql 存储过程里面如何 对数据集循环

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)
这种也可以

热点内容
4岁编程猫 发布:2024-09-22 15:18:46 浏览:579
androidopencv教程 发布:2024-09-22 15:04:59 浏览:454
算法头脑 发布:2024-09-22 15:04:09 浏览:692
ftp错误无法获得远端文件夹信息 发布:2024-09-22 14:20:19 浏览:125
如何在安卓服看到白鸟 发布:2024-09-22 14:20:16 浏览:221
仿回车源码 发布:2024-09-22 14:01:14 浏览:518
mysql数据库索引原理 发布:2024-09-22 13:58:55 浏览:22
android照片旋转 发布:2024-09-22 13:53:39 浏览:443
编程大牛 发布:2024-09-22 13:49:08 浏览:720
为什么电脑弹出代理服务器错误 发布:2024-09-22 13:48:21 浏览:385