當前位置:首頁 » 存儲配置 » 存儲過程循環結果集

存儲過程循環結果集

發布時間: 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)
這種也可以

熱點內容
我的世界啟動器推薦伺服器地址 發布:2024-09-22 13:44:09 瀏覽:637
c語言中的unsignedchar 發布:2024-09-22 13:11:12 瀏覽:168
最好的加密移動硬碟 發布:2024-09-22 12:35:58 瀏覽:156
c語言編程貪吃蛇 發布:2024-09-22 12:34:21 瀏覽:745
青椒雲電腦什麼配置 發布:2024-09-22 12:24:50 瀏覽:279
pythongbkunicode 發布:2024-09-22 12:24:06 瀏覽:992
空調壓縮機保險在哪裡 發布:2024-09-22 12:18:01 瀏覽:364
筆記本配置看哪些 發布:2024-09-22 12:06:41 瀏覽:858
魔獸地圖腳本製作 發布:2024-09-22 12:04:48 瀏覽:800
演算法衰減 發布:2024-09-22 11:58:42 瀏覽:50