1. 程式人生 > >mysql 儲存過程、遊標及逐行處理的配合使用

mysql 儲存過程、遊標及逐行處理的配合使用

1. 資料準備

+----+------+--------+
| id | name | price1 |
+----+------+--------+
|  1 | 大米 | 5      |
|  2 | 雞蛋 | 4.5    |
|  3 | 蘋果 | 6      |
|  4 | 麵粉 | 4      |
|  5 | 小米 | 5.5    |
+----+------+--------+

2. 定義一個儲存過程(供下一儲存過程呼叫)
delimiter //
create procedure getPrice1(
    in id int,
    in addSelf boolean,
    out ototal decimal(6,2)
) comment '根據id及是否價格乘2來獲取價格'
begin
    -- 宣告臨時變數price
    declare price decimal(6,2);
    -- 根據id查詢price1儲存到臨時變數price 
    select price1 from aa01 where aa01.id = id into price;
    -- 判斷是否需要乘2
    if addSelf then
        select price * 2 into price;
    end if;
    -- 最後將臨時變數賦值給輸出變數
    select price into ototal;
end //
delimiter ;

3. 儲存過程、遊標及逐行處理的配合使用
delimiter //
create procedure copyIdAndDoublePrice1()
comment '將原始表中id和price1*2結果賦值到表aa02中'
begin
	-- 宣告區域性變數
	declare done boolean default 0;
	declare tempId int;
	declare tempDoublePrice1 decimal(6,2);
	-- 宣告遊標
	declare idIndex cursor
	for
		select id from aa01;
	-- 宣告迴圈結束條件
	declare continue handler for sqlstate '02000' set done = 1;
	-- 建立aa02表用於儲存結果集
	create table if not exists aa02(
		id int,
		doublePrice1 decimal(6,2)
	);
	-- 開啟遊標
	open idIndex;
	-- 迴圈所有行
	repeat
		-- 獲得當前迴圈的id
		fetch idIndex into tempId;
		-- 呼叫另一個儲存過程獲取結果
		call getPrice1(tempId, 1, tempDoublePrice1);
		-- 將結果插入aa02表
		insert into aa02(id, doublePrice1) values (tempId, tempDoublePrice1);
	-- 結束迴圈
	until done end repeat;
	-- 關閉遊標
	close idIndex;
end //
delimiter ;

4. 呼叫儲存過程及查詢表aa02結果
call copyIdAndDoublePrice1();
select * from aa02;

+----+--------------+
| id | doublePrice1 |
+----+--------------+
|  1 | 10           |
|  2 | 9            |
|  3 | 12           |
|  4 | 8            |
|  5 | 11           |
|  5 | 11           |
+----+--------------+

5. 注意事項

這條語句定義了一個CONTINUE HANDLER,它是在條件出現時被執行的程式碼。這裡,它指出當SQLSTATE '02000'出現時,SET done=1。SQLSTATE'02000'是一個未找到條件,當REPEAT由於沒有更多的行供迴圈而不能繼續時,出現這個條件。

DECLARE語句的次序 DECLARE語句的釋出存在特定的次序。用DECLARE語句定義的區域性變數必須在定義任意遊標或控制代碼之前定義,而控制代碼必須在遊標之後定義。不遵守此順序將產生錯誤訊息。

相關推薦

mysql 儲存過程遊標處理配合使用

1. 資料準備 +----+------+--------+ | id | name | price1 | +----+------+--------+ | 1 | 大米 | 5 | | 2 | 雞蛋 | 4.5 | | 3 | 蘋果 | 6

mysql 初級篇(三) 觸發器儲存過程遊標

mysql 初級篇(三) 觸發器、儲存過程、遊標   觸發器triggerCreat trigger buggoodAfterInsertOn ordFor each rowBeginUpdate goods set num=num-new.much where id=new.gidEnd

MySQL中的儲存過程遊標儲存函式

MySQL中的儲存過程 首先來看兩個問題: 1.什麼是儲存過程? 儲存過程(Stored Procedure)是在資料庫系統中,一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數(如果該儲存過程有引數的話)來執行它。 2.為什麼要使用儲

MySQL 第八篇:自定義函式儲存過程遊標

本篇內容由猿道教育的課程內容整理而來。 我把MySQL的內容整理成9篇部落格,學完這9篇部落格雖不能說能成為大神,但是應付一般中小企業的開發已經足夠了,有疑問或建議的歡迎留言討論。 自定義函式 一、函式的概念與定義 1、理解函式 函式可以看作是

mysql複合語句儲存過程遊標

一、概念: 1、mysql複合語句:必須放在儲存過程或者函式或者其他資料庫物件中 2、儲存過程:一組SQL語句組成,可以帶引數,用於實現特定功能 BEGIN #Routine body goes here... END;放在BEGIN……END中的語句就是複合語句 二、

Oracle儲存過程遊標函式

SQL99是什麼 (1)是操作所有關係型資料庫的規則 (2)是第四代語言 (3)是一種結構化查詢語言 (4)只需發出合法合理的命令,就有對應的結果顯示 SQL的特點 (1)互動性強,非過程化 (2)資料庫操縱能力強,只需傳送命令,無需關注如何實現 (3)多表操作時,自動導航簡單,例如

mysql 儲存過程使用遊標多執行一條記錄

今天在寫資料遷移的儲存過程發現總會多執行一條記錄修改後記錄如下: DECLARE notfoundroute INT DEFAULT 0; declare route_cursor CURSOR FOR select uid, uteamid, iday, ctitle, ctrip, ct

MYSQL儲存過程遊標(2)

儲存過程和遊標! 之前修改了表結構,現在要填充內容了, 需求:將已有的資料表內容進行擴充,比如A表現在增加了欄位,內容在B表,將他轉移過來 這裡經過掙扎,最後達成! /*填充batch_course_p

MYSQL儲存過程遊標學習

自己隨便寫了一個統計使用者許可權數量插入對應表的案例 CREATE TABLE IF NOT EXISTS u_user_role_count ( `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT "表ID", `uid` BIGINT NOT NULL

關於plsql的總結(儲存過程遊標觸發器)

1.什麼是plsql?         PL/SQL Developer是一個整合開發環境,專門開發面向Oracle資料庫的應用。PL/SQL也是一種程式語言,叫做過程化SQL語言(Procedural Language/SQ

修改MySQL儲存過程函式事件觸發器檢視的DEFINER

#修改儲存過程、函式、事件、觸發器、檢視的 DEFINER select definer from mysql.proc; update mysql.proc set definer='[email protected]%'; select DEFINER fro

mysql儲存過程利用遊標查詢每個資料庫的所有表

DELIMITER $ DROP PROCEDURE listAllDB; CREATE PROCEDURE listAllDB() BEGIN DECLARE no_mor

mysql儲存過程檢視等的許可權問題

看儲存過程定義,DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `DB_U1`.`P1`() /*LANGUAGE SQL | [NOT] DETE

MySQL儲存過程遊標的使用

示例:把表中status為0所對應的age值改為99(當然有更簡單的方法,這裡主要是為了學習MySQL儲存過程中游標的使用) 先建表如下: /* 在test庫下建立testb表 */ CREATE

淺談 sqlserver 和 mysql儲存過程函式的區別

其實我不太喜歡搞資料庫,平常也就是用用select、insert。這次公司要把資料庫從sqlserver遷到mysql,我也試著改了幾個儲存過程,在此總結。首先吐槽一句,sqlserver和 mysql差別還真大! 區別一:儲存過程入參 USE [LearningRep

MySQL儲存過程函式

<pre code_snippet_id="419110" snippet_file_name="blog_20140706_2_9316759" name="code" class="sql">儲存程式優勢:</pre>(1).儲存過程增強了SQ

mysql儲存過程詳細講解完整例項下載

一、儲存過程概念1.儲存過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。經編譯後儲存在資料庫 中。2.儲存過程是資料庫中的一個重要物件,使用者通過指定儲存過程的名字並給出引數(如果該儲存過 程帶有引數)來執行它。3.儲存過程是由流控制和SQL語句

mysql儲存過程遊標遍歷

DELIMITER $$ CREATE PROCEDURE alarm_replay_insert_procedure() BEGIN -- 定義變數 DECLARE _nowTime D

5分鐘學會MySQL儲存過程_1定義應用場景

                                          &nb

mysql儲存過程 --遊標的使用 取每記錄 (多欄位)

delimiter $ create PROCEDURE phoneDeal() BEGIN DECLARE id varchar(64); -- id DECLARE phone1 varchar(16); -- phone DECLARE password1