mysql存儲過程的實例(數據庫存儲過程實例)

本文目錄一覽:

mysql存儲過程 in 怎麼用

out 表示輸出的參數,存儲過程調用 代碼 需要獲得此參數值。

in 表示輸入參數,默認為in

例1、一個簡單存儲過程游標實例

複製代碼代碼如下:

DELIMITER $$

DROP PROCEDURE IF EXISTS getUserInfo $$

CREATE PROCEDURE getUserInfo(in date_day datetime)

— 實例

— 存儲過程名為:getUserInfo

— 參數為:date_day日期格式:2008-03-08

BEGIN

declare _userName varchar(12); — 用戶名

declare _chinese int ; — 語文

declare _math int ; — 數學

declare done int;

— 定義游標

DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate, date_day)=0;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

— 獲取昨天的日期

if date_day is null then

set date_day = date_add(now(),interval -1 day);

end if;

open rs_cursor;

cursor_loop:loop

FETCH rs_cursor into _userName, _chinese, _math; — 取數據

if done=1 then

leave cursor_loop;

end if;

— 更新表

update infoSum set total=_chinese+_math where UserName=_userName;

end loop cursor_loop;

close rs_cursor;

END$$

DELIMITER ;

例2、存儲過程游標循環跳出現

在MySQL的存儲過程中,游標操作時,需要執行一個conitnue的操作.眾所周知,MySQL中的游標循環操作常用的有三種,LOOP,REPEAT,WHILE.三種循環,方式大同小異.以前從沒用過,所以記下來,方便以後查閱.

1.REPEAT

複製代碼代碼如下:

REPEAT

Statements;

UNTIL expression

END REPEAT

demo

DECLARE num INT;

DECLARE my_string VARCHAR(255);

REPEAT

SET my_string =CONCAT(my_string,num,’,’);

SET num = num +1;

UNTIL num 5

END REPEAT;

2.WHILE

複製代碼代碼如下:

WHILE expression DO

Statements;

END WHILE

demo

DECLARE num INT;

DECLARE my_string VARCHAR(255);

SET num =1;

SET str =”;

WHILE num span10DO

SET my_string =CONCAT(my_string,num,’,’);

SET num = num +1;

END WHILE;

3.LOOP(這裡面有非常重要的ITERATE,LEAVE)

代碼如下 複製代碼

DECLARE num INT;

DECLARE str VARCHAR(255);

SET num =1;

SET my_string =”;

loop_label: LOOP

IF num 10THEN

LEAVE loop_label;

ENDIF;

SET num = num +1;

IF(num mod3)THEN

ITERATE loop_label;

ELSE

SET my_string =CONCAT(my_string,num,’,’);

ENDIF;

END LOOP;

PS:可以這樣理解ITERATE就是我們程序中常用的contiune,而ITERATE就是break.當然在MySQL存儲過程,需要循環結構有個名稱,其他都是一樣的.

例3,mysql 存儲過程中使用多游標

先創建一張表,插入一些測試數據:

複製代碼代碼如下:

DROP TABLE IF EXISTS netingcn_proc_test;

CREATE TABLE `netingcn_proc_test` (

`id` INTEGER(11) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(20),

`password` VARCHAR(20),

PRIMARY KEY (`id`)

)ENGINE=InnoDB;

insert into netingcn_proc_test(name, password) values

(‘procedure1’, ‘pass1’),

(‘procedure2’, ‘pass2’),

(‘procedure3’, ‘pass3’),

(‘procedure4’, ‘pass4’);下面就是一個簡單存儲過程的例子:

drop procedure IF EXISTS test_proc;

delimiter //

create procedure test_proc()

begin

— 聲明一個標誌done, 用來判斷游標是否遍歷完成

DECLARE done INT DEFAULT 0;

— 聲明一個變量,用來存放從游標中提取的數據

— 特別注意這裡的名字不能與由游標中使用的列明相同,否則得到的數據都是NULL

DECLARE tname varchar(50) DEFAULT NULL;

DECLARE tpass varchar(50) DEFAULT NULL;

— 聲明游標對應的 SQL 語句

DECLARE cur CURSOR FOR

select name, password from netingcn_proc_test;

— 在游標循環到最後會將 done 設置為 1

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

— 執行查詢

open cur;

— 遍歷游標每一行

REPEAT

— 把一行的信息存放在對應的變量中

FETCH cur INTO tname, tpass;

if not done then

— 這裡就可以使用 tname, tpass 對應的信息了

select tname, tpass;

end if;

UNTIL done END REPEAT;

CLOSE cur;

end

//

delimiter ;

— 執行存儲過程

call test_proc();

需要注意的是變量的聲明、游標的聲明和HANDLER聲明的順序不能搞錯,必須是先聲明變量,再申明游標,最後聲明HANDLER。上述存儲過程的例子中只使用了一個游標,那麼如果要使用兩個或者更多游標怎麼辦,其實很簡單,可以這麼說,一個怎麼用兩個就是怎麼用的。例子如下:

複製代碼代碼如下:

drop procedure IF EXISTS test_proc_1;

delimiter //

create procedure test_proc_1()

begin

DECLARE done INT DEFAULT 0;

DECLARE tid int(11) DEFAULT 0;

DECLARE tname varchar(50) DEFAULT NULL;

DECLARE tpass varchar(50) DEFAULT NULL;

DECLARE cur_1 CURSOR FOR

select name, password from netingcn_proc_test;

DECLARE cur_2 CURSOR FOR

select id, name from netingcn_proc_test;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

open cur_1;

REPEAT

FETCH cur_1 INTO tname, tpass;

if not done then

select tname, tpass;

end if;

UNTIL done END REPEAT;

CLOSE cur_1;

— 注意這裡,一定要重置done的值為 0

set done = 0;

open cur_2;

REPEAT

FETCH cur_2 INTO tid, tname;

if not done then

select tid, tname;

end if;

UNTIL done END REPEAT;

CLOSE cur_2;

end

//

delimiter ;

call test_proc_1();

上述代碼和第一個例子中基本一樣,就是多了一個游標聲明和遍歷游標。這裡需要注意的是,在遍歷第二個游標前使用了set done = 0,因為當第一個游標遍歷玩後其值被handler設置為1了,如果不用set把它設置為 0 ,那麼第二個游標就不會遍歷了。當然好習慣是在每個打開游標的操作前都用該語句,確保游標能真正遍歷。當然還可以使用begin語句塊嵌套的方式來處理多個游標,例如:

複製代碼代碼如下:

drop procedure IF EXISTS test_proc_2;

delimiter //

create procedure test_proc_2()

begin

DECLARE done INT DEFAULT 0;

DECLARE tname varchar(50) DEFAULT NULL;

DECLARE tpass varchar(50) DEFAULT NULL;

DECLARE cur_1 CURSOR FOR

select name, password from netingcn_proc_test;

DECLARE cur_2 CURSOR FOR

select id, name from netingcn_proc_test;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

open cur_1;

REPEAT

FETCH cur_1 INTO tname, tpass;

if not done then

select tname, tpass;

end if;

UNTIL done END REPEAT;

CLOSE cur_1;

begin

DECLARE done INT DEFAULT 0;

DECLARE tid int(11) DEFAULT 0;

DECLARE tname varchar(50) DEFAULT NULL;

DECLARE cur_2 CURSOR FOR

select id, name from netingcn_proc_test;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

open cur_2;

REPEAT

FETCH cur_2 INTO tid, tname;

if not done then

select tid, tname;

end if;

UNTIL done END REPEAT;

CLOSE cur_2;

end;

end

//

delimiter ;

call test_proc_2();

如何使用mysql 存儲過程 實例

DECLARE var_name[,…] type [DEFAULT value]這個語句被用來聲明局部變量。要給變量提供一個默認值,請包含一個DEFAULT子句。值可以被指定為一個表達式,不需要為一個常數。如果沒有DEFAULT子句,初始值為NULL。局部變量的作用範圍在它被聲明的BEGIN … END塊內。它可以被用在嵌套的塊中,除了那些用相同名字聲明變量的塊。

mysql 存儲過程總結(一)

1、存儲過程定義:

存儲過程是事先經過編譯並存儲在數據庫中的一段 SQL 語句的集合,調用存儲過程可以簡化應用開發 人員的很多工作,減少數據在數據庫和應用服務器之間的傳輸,對於提高數據處理的效率是有好處的。 存儲過程思想上很簡單,就是數據庫 SQL 語言層面的代碼封裝與重用。

2、特點:

封裝,復用 : 可以把某一業務SQL封裝在存儲過程中,需要用到 的時候直接調用即可。

可以接收參數,也可以返回數據 :再存儲過程中,可以傳遞參數,也可以接收返回 值。

減少網絡交互,效率提升 : 如果涉及到多條SQL,每執行一次都是一次網絡傳 輸。 而如果封裝在存儲過程中,我們只需要網絡交互一次可能就可以了。

3、基本語法

(1)創建:

(2)調用:

(3)查看:

(4)刪除

注意: 在命令行中,執行創建存儲過程的SQL時,需要通過關鍵字 delimiter 指定SQL語句的 結束符。

mysql存儲過程實例

你是指‘01’ 想動態的可以用別的值? 可以在創建存儲過程時 用in ,也就是調用存儲過程是傳入參數

大概像這個樣子create procedure sp_test(in a char(50)),然後將’01’換為a

mysql創建存儲過程示例

1

用mysql客戶端登入

2

選擇數據庫

mysqluse

test

3

查詢當前數據庫有哪些存儲過程

mysqlshow

procedure

status

where

db=’test’

4

創建一個簡單的存儲過程

mysqlcreate

procedure

hi()

select

‘hello’;

5

存儲過程創建完畢,看怎麼調用它

mysqlcall

hi();

顯示結果

mysql

call

hi();

+——-+

|

hello

|

+——-+

|

hello

|

+——-+

1

row

in

set

(0.00

sec)

query

ok,

rows

affected

(0.01

sec)

6

一個簡單的儲存過程就成功了

求一個MYSQL存儲過程的例子

DELIMITER $$

DROP PROCEDURE IF EXISTS `proc_test`$$

CREATE

PROCEDURE `carpo_xianjin`.`proc_test`(IN user_name VARCHAR(50), IN amount VARCHAR(20))

BEGIN

DECLARE v_balance VARCHAR(20);

SELECT balance INTO v_balance FROM userbalance WHERE USER = user_name;

IF v_balance amount THEN

UPDATE userbalance SET balance = balance – amount WHERE USER = user_name;

INSERT INTO LOG(TYPE) VALUES(‘修改餘額’);

END IF;

END$$

DELIMITER ;

看下吧,你沒給腳本,我也沒辦法測試。

原創文章,作者:RQXP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/137019.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
RQXP的頭像RQXP
上一篇 2024-10-04 00:17
下一篇 2024-10-04 00:17

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的數據庫存儲引擎

    本文將介紹兩款高性能的數據庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入數據庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的數據庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28

發表回復

登錄後才能評論