1. 程式人生 > 資料庫 >MySQL儲存結構用法案例分析

MySQL儲存結構用法案例分析

本文例項講述了MySQL儲存結構用法。分享給大家供大家參考,具體如下:

前言

今天公司老大讓我做一個MySQL的調研工作,是關於MySQL的儲存結構的使用。這裡我會通過3個例子來介紹一下MySQL中儲存結構的使用過程,以及一些需要注意的點。

筆者環境

系統:Windows 7

MySQL:MySQL 5.0.96

準備工作

1.新建兩張資料表:student1,student2

新建student1

DROP TABLE IF EXISTS student1;
CREATE TABLE student1 (
id INT NOT NULL auto_increment,name TEXT,age INT,PRIMARY KEY(id)
);

新建student2

DROP TABLE IF EXISTS student2;
CREATE TABLE student2 (
id INT NOT NULL auto_increment,PRIMARY KEY(id)
);

2.向student1中新增資料

INSERT INTO student1 (name,age) VALUES ('xiaoming',18);
INSERT INTO student1 (name,age) VALUES ('xiaohong',17);
INSERT INTO student1 (name,age) VALUES ('xiaogang',19);
INSERT INTO student1 (name,age) VALUES ('xiaoyu',age) VALUES ('xiaohua',20);

實現功能說明

1.列印student1中的部分資訊

2.把student1中的部分資料複製到student2中

3.傳入引數作為限制條件,把student1中的部分資料複製到student2中

注意事項

在編寫儲存結構的時候,我們不能以分號(;)結束。因為我們的SQL語句就是以分號(;)結尾的。這裡我們要修改一下儲存結構的結束符號(&&)。

這裡我們使用MySQL中的DELIMITER進行修改,並在儲存結構建立完畢時,再改為分號(;)結束即可。

關於這一點在後面的例子中有所體現。在編寫MySQL的觸發器中,也會用到類似的情況。

使用方式

1.列印student1中的部分資訊

---------------------------------------------------------------
DROP PROCEDURE IF EXISTS test_pro1;
---------------------------------------------------------------
DELIMITER &&
CREATE PROCEDURE test_pro1()
BEGIN
 set @sentence = 'select * from student1 where age<19;';
 prepare stmt from @sentence;
 execute stmt;
 deallocate prepare stmt;
END &&
DELIMITER ;

2.複製表儲存過程的編寫(不帶引數)

---------------------------------------------------------------
DROP PROCEDURE IF EXISTS test_pro2;
---------------------------------------------------------------
DELIMITER &&
create procedure test_pro2()
begin
  DECLARE stop_flag INT DEFAULT 0;
  DECLARE s_name TEXT default '';
  DECLARE s_age INT default 0;
  DECLARE cur1 CURSOR FOR (select name,age from student1 where age<19);
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stop_flag=1;
  open cur1;
    fetch cur1 into s_name,s_age;
  while stop_flag<>1 DO
    insert into student2(name,age) values(s_name,s_age);
    fetch cur1 into s_name,s_age;
  end while;
  close cur1;
end &&
DELIMITER ;

3.複製表儲存過程的編寫(帶引數)

---------------------------------------------------------------
DROP PROCEDURE IF EXISTS test_pro3;
---------------------------------------------------------------
DELIMITER &&
create procedure test_pro3(IN p_age INT)
begin
  DECLARE stop_flag INT DEFAULT 0;
  DECLARE s_name TEXT default '';
  DECLARE s_age INT default 0;
  DECLARE cur1 CURSOR FOR (select name,age from student1 where age<p_age);
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET stop_flag=1;
  open cur1;
    fetch cur1 into s_name,s_age;
  end while;
  close cur1;
end &&
DELIMITER ;

這裡的SQLSTATE '02000'和NOT FOUND系統返回值是一樣的。

4.使用方式

call test_pro1();

or

call test_pro1(123);

更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL儲存過程技巧大全》、《MySQL常用函式大彙總》、《MySQL日誌操作技巧大全》、《MySQL事務操作技巧彙總》及《MySQL資料庫鎖相關技巧彙總》

希望本文所述對大家MySQL資料庫計有所幫助。