mysql存儲過程遍歷結果集
㈠ 在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
㈡ MySQL存儲過程會直接查詢主庫
主庫和從庫都直接可以查詢。
MySQL存儲過程-循環遍歷查詢到的結果集:根據MySQL的語法創建存儲過程,要注意的是如果循環遍歷查詢到的結果集,取出結果集中的數據做操作。
㈢ mysql 存儲過程結果集怎麼處理
[java] view plain
con = Mytest.getConn(); //獲取連接
String sql = "{call test()}";
cs = con.prepareCall(sql);
boolean hadResults = cs.execute();
int i=0;
while (hadResults) {
System.out.println(++i);
ResultSet rs = cs.getResultSet();
while (rs != null && rs.next()) {
㈣ mybatis調用mysql存儲過程(返回參數,單結果集,多結果集)
mybatis調用mysql存儲過程(返回參數,單結果集,多結果集)
註: RETCODE、RETDESC 這里的輸出值不用在函數里 SELECT RETCODE; ,因為即使沒有,當執行成功後會自動返回在對象里(Object/Map),所以在函數里不用SELECT一下了。
Navicat中執行函數需要輸入參數值,也是對應圖1,@A@B表示輸出值。(一個輸入值兩個輸出值)
1. 標注一二三四五處如果存在,則執行成功後返回結果如下
標注一對應結果1
標注二對應結果2
標注三對應結果3
標注四對應結果4
標注五對應結果5
其中結果3返回的是集合。
存在這么多結果,想要取結果3中的集合是不好取的,只有像下圖一樣只有一個結果才好取出集合。
2. 標注一二四五處如果不存在,則執行成功後返回結果如下
只有結果1,對應的是標注三處的值。可以取出集合
函數p_plicate_enroll
㈤ mysql遍歷數組執行更新(存儲過程)
CREATE PROCEDURE init_reportUrl()
BEGIN
DECLARE s INT DEFAULT 0;
DECLARE r_id bigint(10);
DECLARE report CURSOR FOR select distinct id as r_id FROM ReportHotLine ;
-- 聲明當游標遍歷完後將標志變數置成某個值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
-- 打開游標
open report;
-- 將游標中的值賦值給變數,注意:變數名不要和返回的列名同名,變數順序要和sql結果列的順序一致
fetch report into r_id;
-- 當s不等於1,也就是未遍歷完時,會一直循環
while s<>1 do
-- 執行業務邏輯
UPDATE wh_csyx . dy_pres30207800013_001_local a
JOIN ReportHotLine b ON a.gdId = b.ID
AND b.createtime = ( SELECT max( createtime ) FROM ReportHotLine WHERE ID = r_id )
SET blms = b.banliInfo where a.gdId =r_id;
-- 將游標中的值再賦值給變數,供下次循環使用
fetch report into r_id;
-- 當s等於1時表明遍歷以完成,退出循環
end while;
-- 關閉游標
close report;
END;
call init_reportUrl();
㈥ 怎樣得到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(); // 檢查是否存在更多結果集
}
㈦ mysql存儲過程游標結果集時,數據沒有遍歷完整
CREATEDEFINER=`root`@`%`PROCEDURE`insertPresale`()
BEGIN
#Routinebodygoeshere...
DECLAREdoneINTDEFAULT0;/*用於判斷是否結束循環*/
DECLAREgoodsIdVARCHAR(255);#標記商品id
DECLAREflagINTDEFAULT0;#標記資料庫是否包含此條商品記錄
/*用於存儲結果集的記錄*/
/*定義游標*/
_idFROM`sys_goods_publish`WHEREpresale=1ANDpresale_time<=NOW();
/*定義設置循環結束標識done值怎麼改變的邏輯*/
=1;/*done=true;亦可*/
OPENidCur;/*打開游標*/
/*循環開始*/
REPEAT
#/*如果要fetch多列應該這樣寫,fetchcur/*對應下面的idCur*/
FETCHidCurINTOgoodsId;/*還可以fetch多列(假設結果集的記錄不是單列的話)*/
IFNOTdoneTHEN/*數值為非0,MySQL認為是true*/
SELECTCOUNT(*)INTOflagFROM`itemsinfonew`WHERETaoBaoitemId=goodsId;
IF(flag>0)THEN#如果資料庫中有爬取此條記錄則刪除已用戶發布的為准
DELETEFROM`itemsinfonew`WHERETaoBaoitemId=goodsId;
ENDIF;
INSERTINTO`itemsinfonew`(TaoBaoitemId,CouponID,CreateSourceName)
SELECTgoods_id,coupon_id,SUBSTRING("customer_fd",0.5)
FROM`sys_goods_publish`
WHEREpresale_time<=NOW()ANDgoods_id=goodsId;
UPDATE`sys_goods_publish`SETpresale=0WHEREpresale=1ANDpresale_time<=NOW()ANDgoods_id=goodsId;
ENDIF;
UNTILdoneENDREPEAT;
CLOSEidCur;/*關閉游標*/
㈧ MySQL 存儲過程,獲取使用游標查詢的結果集
MySQL 存儲過程中,使用游標查詢,返回的是結果集時,如何查看調用存儲過程輸出結果呢?
解決方案:存儲過程不返回數據,但它能創建和填充另一個表。所以在存儲過程運行中創建臨時表。該臨時表將保存存儲過程中生成的結果集,在遍歷游標時,用insert保存每條數據到臨時表中。後續調用時可以用select語句查詢臨時表中的存儲過程運行結果。
以下有 三種方式 使用游標創建一個存儲過程,統計某一部門下的員工信息
方法一:Loop循環
調用存儲過程:
方法二:While 循環
調用存儲過程:
方法三:REPEAT 循環
調用存儲過程:
上述三種實現方法在測試過程中遇到下述問題。
調用存儲過程查詢臨時表輸出結果時,會發現多循環了一次,像這樣:
解決方法:
在遍歷游標查詢結果時,先判斷游標的結束標志(done) 是否是為1,如果不是1,則向臨時表中插入數據。
㈨ 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)
這種也可以