當前位置:首頁 » 存儲配置 » mysql存儲過程循環插入

mysql存儲過程循環插入

發布時間: 2023-06-06 02:15:10

① 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
----將存儲過程返回的列值再重新插入源表中

② MySQL實現創建存儲過程並循環添加記錄的方法

本文實例講述了MySQL實現創建存儲過程並循環添加記錄的方法。分享給大家供大家參考,具體如下:
先創建,然後調用:
--
創建存儲過程
DELIMITER;//
create
procere
myproc()
begin
declare
num
int;
set
num=1;
while
num
<=
24
do
insert
into
t_calendar_hour(hourlist)
values(num);
set
num=num+1;
end
while;
commit;
end;//
--
調用存儲過程
CALL
myproc();
PS:這里再為大家推薦2款常用的sql在線工具供大家參考使用(包含SQL語句用法說明):
SQL在線壓縮/格式化工具:
http://tools.jb51.net/code/sql_format_compress
SQL代碼在線格式化美化工具:
http://tools.jb51.net/code/sqlcodeformat
更多關於MySQL相關內容感興趣的讀者可查看本站專題:《MySQL存儲過程技巧大全》、《MySQL常用函數大匯總》、《MySQL日誌操作技巧大全》、《MySQL事務操作技巧匯總》及《MySQL資料庫鎖相關技巧匯總》
希望本文所述對大家MySQL資料庫計有所幫助。

③ 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)
這種也可以

④ mysql里的存儲過程是怎樣循環的

declare storeId varchar(10);
在存儲過程中創建游標,這個游標裡面存了你所有要循環的數據,集合:
declare diy_cursor cursor for
select store_id from t_b_store;

open diy_cursor;--打開游標
diy_loop:loop ---這里開始循環
FETCH diy_cursor into storeId; --提取本次循環的數據,保存在storeId中
if done = 1 then --done是在存儲過程開始的時候定義的一個整形變數
leave diy_loop;---如果游標中的數據提取完畢,就自動跳出這個循環end if;
----在這里用你循環取到的storeId做你想做的事情,就是寫你的sql啦---
end loop; --循環結束
close diy_loop; --關閉游標

⑤ MySQL存儲過程二

上一節存儲過程封裝的都是簡單的select語句,直接使用被封裝的語句就能完成。所以存儲過程往往應用於更復雜的業務規則處理時更有效

看一個例子

這個例子使用元素比較多,解釋一下:

COMMENT為表添加了一句注釋;

-- 單行注釋,注釋跟在後面的內容,需要注意-- 後需要加一個空格才能生效;

(#注釋內容        /*注釋內容*/  這兩種方法也能進行注釋)

Declare用來聲明變數,一句declare只能聲明一個變數,變數必須先聲明後使用

If...Then是進行條件判斷的,基本語句如下:

If ... Then ... Else ... End If;

這個存儲過程完成了訂單合計,並判斷該訂單是否需要增加營業稅。taxable是一個布爾值(如果要增稅為真,否則為假)。在存儲體中定義了兩個局部變數。並將結果存儲到局部變數total中。if語句檢查taxable是否為真,如果為真,則用另一條select語句增加營業稅。最後將total結果保存到ototal中。

調用結果如下:

檢查存儲過程

SHOW  CREATE  PROCEDURE  過程名;

為了獲得包括何時、由誰創建等詳細信息的存儲過程列表,使用

Show procere status;  -- 會列出所有存儲過程

可以添加過濾,比如

存儲過程循環語句

1. while

WHILE (表達式)  DO 

...

END WHILE;

看一個例子

創建了一個循環存儲過程,重復向human插入5條記錄。下面調用看一下結果

2.repeat

基本語句:

Repeat ...until 條件...END  Repeat;

同樣操作,使用repeat執行如下

⑥ mysql存儲過程里怎麼循環一張表

給你一個 參考

--存儲過程名和參數,參數中in表示傳入參數,out標示傳出參數,inout表示傳入傳出參數

create procere p_procerecode(in sumdate varchar(10))
begin
declare v_sql varchar(500); --需要執行的SQL語句
declare sym varchar(6);

declare var1 varchar(20);
declare var2 varchar(70);
declare var3 integer;

--定義游標遍歷時,作為判斷是否遍歷完全部記錄的標記
declare no_more_departments integer DEFAULT 0;

--定義游標名字為C_RESULT
DECLARE C_RESULT CURSOR FOR
SELECT barcode,barname,barnum FROM tmp_table;

--聲明當游標遍歷完全部記錄後將標志變數置成某個值
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET no_more_departments=1;

set sym=substring(sumdate,1,6); --截取字元串,並將其賦值給一個遍歷

--連接字元串構成完整SQL語句,動態SQL執行後的結果記錄集,在MySQL中無法獲取,因此需要轉變思路將其放置到一個臨時表中(注意代碼中的寫法)。一般寫法如下:

-- 'Create TEMPORARY Table 表名(Select的查詢語句);
set v_sql= concat('Create TEMPORARY Table tmp_table(select aa as aacode,bb as aaname,count(cc) as ccnum from h',sym,' where substring(dd,1,8)=''',sumdate,''' group by aa,bb)');

set @v_sql=v_sql; --注意很重要,將連成成的字元串賦值給一個變數(可以之前沒有定義,但要以@開頭)
prepare stmt from @v_sql; --預處理需要執行的動態SQL,其中stmt是一個變數
EXECUTE stmt; --執行SQL語句
deallocate prepare stmt; --釋放掉預處理段

OPEN C_RESULT; --打開之前定義的游標
REPEAT --循環語句的關鍵詞
FETCH C_RESULT INTO VAR1, VAR2, VAR3; --取出每條記錄並賦值給相關變數,注意順序

--執行查詢語句,並將獲得的值付給一個變數 @oldaacode(注意如果以@開頭的變數可以不用通過declare語句事先聲明)
select @oldaacode:=vcaaCode from T_sum where vcaaCode=var1 and dtDate=sumdate;
if @oldaacode=var1 then --判斷
update T_sum set iNum=var3 where vcaaCode=var1 and dtDate=sumdate;
else
insert into T_sum(vcaaCode,vcaaName,iNum,dtDate) values(var1,var2,var3,sumdate);
end if;
UNTIL no_more_departments END REPEAT; --循環語句結束
CLOSE C_RESULT; --關閉游標

DROP TEMPORARY TABLE tmp_table; --刪除臨時表
end;

⑦ mysql存儲過程游標循環用哪種比較好

如果沒有則插入數據,如果有則更新的方法:
insert into `test` values (a,b) ON DUPLICATE KEY UPDATE `a`=c;

[sql] view plain
CREATE PROCEDURE `test`.`new_procere` ()
BEGIN
-- 需要定義接收游標數據的變數
DECLARE a CHAR(16);
-- 游標
DECLARE cur CURSOR FOR SELECT i FROM test.t;
-- 遍歷數據結束標志
DECLARE done INT DEFAULT FALSE;
-- 將結束標志綁定到游標
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- 打開游標
OPEN cur;

-- 開始循環
read_loop: LOOP
-- 提取游標里的數據,這里只有一個,多個的話也一樣;
FETCH cur INTO a;
-- 聲明結束的時候
IF done THEN
LEAVE read_loop;
END IF;
-- 這里做你想做的循環的事件

INSERT INTO test.t VALUES (a);

END LOOP;
-- 關閉游標
CLOSE cur;

END

實例2

[sql] view plain
BEGIN
DECLARE Done INT DEFAULT 0;

DECLARE CurrentLingQi INT;

DECLARE ShizuName VARCHAR(30);
/* 聲明游標 */
DECLARE rs CURSOR FOR SELECT NodeName, LingQi FROM socialrelation;
/* 異常處理 */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;

/* 打開游標 */
OPEN rs;

/* 逐個取出當前記錄LingQi欄位的值,需要進行最大值的判斷 */
FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;
/* 遍歷數據表 */
REPEAT
IF NOT Done THEN
SET CurrentLingQi = CurrentLingQi + 60;
/* 如果更新後靈氣值大於允許的最大值,則就設置為最大值 */
IF CurrentLingQi >= 1800 THEN
UPDATE socialrelation SET LingQi = 1800 WHERE NodeName = ShizuName;
ELSE
/* 否則,正常更新 */
UPDATE socialrelation SET LingQi = LingQi + 60 WHERE NodeName = ShizuName;
END IF;
END IF;

FETCH NEXT FROM rs INTO ShizuName, CurrentLingQi;

UNTIL Done END REPEAT;

/* 關閉游標 */
CLOSE rs;
END

熱點內容
php查詢結果數組 發布:2025-02-06 12:31:05 瀏覽:714
怎樣把照片壓縮打包 發布:2025-02-06 12:15:19 瀏覽:495
如何編譯java文件 發布:2025-02-06 12:05:58 瀏覽:237
九九乘法編程 發布:2025-02-06 12:05:05 瀏覽:519
台式機忘記開機密碼怎麼辦 發布:2025-02-06 11:58:01 瀏覽:870
android刷新按鈕 發布:2025-02-06 11:57:17 瀏覽:586
存儲過程有輸入參數和輸出參數 發布:2025-02-06 11:55:32 瀏覽:99
成績評選演算法 發布:2025-02-06 11:42:51 瀏覽:997
資料庫測試數據 發布:2025-02-06 11:31:05 瀏覽:824
球頭軸編程 發布:2025-02-06 11:29:36 瀏覽:283