MySQL之存儲過程實例講解(創建、調用、查看、修改、刪除)


1、存儲過程簡介:

存儲過程,英文名Stored Procedure,說簡單點,就是將MySQL語句集或必要的程序封裝在一個結構體里面,存儲在數據庫中,供外部調用的一個數據庫對象,存儲過程在思想上很簡單,就是SQL代碼的封裝與重用。

優點

  • 存儲過程可封裝,並隱藏復雜的商業邏輯。
  • 存儲過程可以回傳值,並可以接受參數。
  • 存儲過程可以返回多個值,而普通函數只能返回一個值。
  • 存儲過程無法使用 SELECT 指令來運行,因為它是子程序,與查看表,數據表或用戶定義函數不同。
  • 存儲過程可以用在數據檢驗,強制實行商業邏輯等。

缺點

  • 存儲過程,往往定制化於特定的數據庫上,因為支持的編程語言不同。當切換到其他廠商的數據庫系統時,需要重寫原有的存儲過程。
  • 存儲過程的性能調校與撰寫,受限於各種數據庫系統。

 

2、學習前准備(主題引出)

創建一張簡單表名為table1,僅有一個列name;

SQL語句:create table table1(name varchar(10));

 

再創建兩張表運動員和賽事情況表;

SQL語句-運動員表:

 create table Players(
 id int(10)  Auto_Increment Not null Primary Key,
 name varchar(20)  Not null,
 age varchar(4) not null,
 gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;

 

SQL語句-賽事情況表:

create table Matches(

id int(10) Auto_Increment Not null,

MATCHNO int(5)  Not null,

TEAMNO Varchar(6)  not Null,

PLAYERNO int(7) Not null ,

WON Int(8) not null,

LOST varchar(2),

Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;

 

向三張表插入數據:

insert into table1 values(78);insert into table1 values('ls');

insert into players  values(1,'lsq',22,'男');insert into Players  values(2,'lqq',23,'女');

insert into Matches values(1,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);

注意:小細節,關於SQL語句結構體是不分大小寫的,但表名必須區分大小寫,我用的Mysql版本是8.0后的版本。

這些語句我們可以寫成存儲語句,外部調用,一次性執行。

 存儲過程語句:

Delimiter //
CREATE PROCEDURE first_proc()
BEGIN
DECLARE x VARCHAR(20) DEFAULT '';
DECLARE y VARCHAR(20) DEFAULT '';
DECLARE z VARCHAR(20) DEFAULT '';
DECLARE m VARCHAR(20) DEFAULT '';
DECLARE n VARCHAR(20) DEFAULT '';
DECLARE o VARCHAR(20) DEFAULT '';
DECLARE p VARCHAR(20) DEFAULT '';
set x='執行開始了,先刪除之前創建的三張表';
drop table table1;
drop table Players;
drop table Matches;
select x;
set y='創建第一張table1';
select y;
create table table1(name varchar(10));
set z='創建第二張表Players';
select z;
create table Players(
id int(10)  Auto_Increment Not null Primary Key,
name varchar(20)  Not null,
age varchar(4) not null,
gender varchar(4))Engine=InnoDB Auto_increment=1 Default Charset=utf8;
set m='創建第三張表';
select m;
create table Matches(
id int(10) Auto_Increment Not null,
MATCHNO int(5)  Not null,
TEAMNO Varchar(6)  not Null,
PLAYERNO int(7) Not null ,
WON Int(8) not null,
LOST varchar(2),
Primary Key(id))Engine=InnoDB Auto_increment=1 default Charset =utf8;
set n='向表中插入數據';
select n;
insert into table1  values(78);insert into table1 values('ls');
insert into Players values(1,'lsq',22,'男');insert into Players values(2,'lqq',23,'女');
insert into Matches values(1 ,5,6,3,8,9); insert into Matches values(2,2,3,4,3,8);
set o='下面是每張表的詳細信息';
select z;
select * from table1;
select * from Players;
select * from Matches;
set p='結束';
select p;
end;
//
Delimiter ;
call first_proc;
 
在此,你可能會問,我直接執行SQL語句豈不是來得更直接?很明顯,你在抬杠了,存儲過程的用途絕不僅限於此,這里的重點是引出“存儲過程”話題,你有沒有發現這里我們僅需調用一下first_proc,預設的所有功能都一步到位了嗎
 
3、存儲過程基本語法

聲明語句結束符,可以自定義:

DELIMITER $$

DELIMITER //

其他任意符號都行,結構體寫完,推薦都用";" 習慣了。

聲明存儲過程:

CREATE PROCEDURE proc_name(IN p_in int)

存儲過程開始和結束符號:

BEGIN .... END

變量定義:

DECLARE num int unsigned default 100;

Declare char_1 varchar(10) default '';

變量賦值:

set num=23;

set  char_1='我是齊天大聖';

存儲過程結構體:

存儲過程體包含了在過程調用時必須執行的語句,例如:dml、ddl語句,if-then-else和while-do語句、聲明變量的declare語句等
過程體格式:以begin開始,以end結束(可嵌套)
BEGIN
  BEGIN
    BEGIN
      statements;
    END
  END
END

4、實操
 
4.1、關於參數
Create  Procedure   存儲過程名([[IN |OUT |INOUT ] 參數名 數據類形...])
  • IN 輸入參數:表示調用者向過程傳入值(傳入值可以是字面量或變量)
  • OUT 輸出參數:表示過程向調用者傳出值(可以返回多個值)(傳出值只能是變量)
  • INOUT 輸入輸出參數:既表示調用者向過程傳入值,又表示過程向調用者傳出值(值只能是變量)
例1:外部傳參到結構體

Delimiter //
Create Procedure proc_in(In p_in varchar(20))
Begin
select p_in;
insert into table1 values(p_in);
select * from table1;
set p_in='我是牛魔王';
select p_in;
End;
//
Delimiter ;
set @p_in='我是齊天大聖';
call proc_in(@p_in);

設置傳入參數值:

調用存儲過程:  可以看到外部參數被傳進存儲過程體,然后再插入table1表中,接着在結構體內更改了變量。

例2:結構體內部參數傳到外面

Delimiter //
Create Procedure proc_out(Out  p_out  varchar(20))
Begin
select p_out;
set p_out='我是牛魔王';
insert into table1 values(p_out);
select  * from  table1;
End;
//
Delimiter ;
set @p_out='我是太白金星';
call proc_out(@p_out);

調用存儲過程:可以看出“太白金星”並沒有被傳到存儲過程結構體中。

select @p_out;  

結果是結構體中返回的變量“牛魔王”。

例3:既能輸入也能輸出

 只需 InOut:  create procedure inout_param(InOut p_inout  int)
 這里不再詳細闡釋。
 
4.2、關於存儲過程變量
 
 局部聲明變量: DECLARE  variable_name [,variable_name...] datatype [DEFAULT value];
 

其中,datatype 為 MySQL 的數據類型,如: int, float, date,varchar(length)

例如:

DECLARE l_int int unsigned default 400;
DECLARE l_numeric number(8,2) DEFAULT 9.95;
DECLARE l_date date DEFAULT '1999-12-31';
DECLARE l_datetime datetime DEFAULT '1999-12-31 23:59:59';
DECLARE l_varchar varchar(255) DEFAULT 'This will not be padded';
變量賦值:
SET 變量名 = 表達式值 [,variable_name = expression ...]
 set x=500;
 
  在存儲過程匯總使用變量:

CREATE PROCEDURE GreetWorld1()  SELECT CONCAT(@greeting,' World') As "hello world";
SET @greeting='Hello';
CALL GreetWorld1( );

 

在MySQL客戶端使用存儲變量:讀者自行測試

SELECT 'Hello World' into @x;
SELECT @x;

SET @y='Goodbye Cruel World';
SELECT @y;

SET @z=1+2+3;
SELECT @z;

在存儲過程間傳遞全局范圍的用戶變量:不推薦,濫用變量會導致難以理解和管理

CREATE PROCEDURE p1() SET @last_procedure='p1';
CREATE PROCEDURE p2() SELECT CONCAT('Last procedure was ',@last_procedure);
CALL p1( );
CALL p2( );

 

 4.3、存儲過程查看

 select routine_name from information_schema.routines where routine_schema='數據庫名';

 select routine_name from information_schema.routines where routine_schema='shop';
 

show procedure status where db='shop';

 

show create procedure  first_proc;    #表示查看創建存儲過程的語句

 4.4、刪除存儲過程
drop procedure proc_name;
 
4.5、存儲過程修改
 注:存儲過程只能修改特征,不能修改過程里面的sql語句及參數變量,如果想對過程體結構更改,只能是刪掉存儲過程,然后重建。
 
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:
  COMMENT 'string'
  |LANGUAGE SQL
  |{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  |SQL SECURITY { DEFINER | INVOKER }
 

存儲過程的特征characteristic:指定存儲的特性

1、COMMENT 'string'是注釋信息;

  LANGUAGE SQL是指明過程體是用sql語言編寫的,而不是java或php;

2、SQL SECURITY { DEFINER | INVOKER }指明誰有權限來執行:

  DEFINER表示只有定義者自己才能夠執行;

  INVOKER表示調用者可以執行。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM