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

来源:http://www.cnblogs.com/sztx/archive/2017/08/13/7354421.html
-Advertisement-
Play Games

存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。經編譯後存儲在資料庫 中的存儲過程概念定義及存儲過程優點和缺點。 procedure通過完整的存儲過程實例來掌握存儲過程的創建、修改、刪除、顯示語法使用操作。掌握變數在實例中的應用,完整實例下載在以後工作中的應用... ...


一、存儲過程概念
  1.存儲過程(Stored Procedure)是一組為了完成特定功能的SQL語句集。經編譯後存儲在資料庫 中。
  2.存儲過程是資料庫中的一個重要對象,用戶通過指定存儲過程的名字並給出參數(如果該存儲過 程帶有參數)來執行它。
  3.存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中。
  4.存儲過程可由應用程式通過一個調用來執行,而且允許用戶聲明變數。
  5.同時,存儲過程可以接收和輸出參數、返回執行存儲過程的狀態值,也可以嵌套調用。
二、存儲過程優點
  1.增強了SQL語句的功能和靈活性
  2不需要反覆建立一系列處理步驟,保證了數據的完整性
  3.降低了網路的通信量,客戶端調用存儲過程只需要傳存儲過程名和相關參數即可,與傳輸SQL語 句相比自然數據量少了很多
  4.增強了使用的安全性,通過存儲過程可以使沒有許可權的用戶在控制之下間接地存取資料庫,從而 保證數據的安全。
  5.可以實現集中控制,當規則發生改變時,只需要修改存儲過程就可以。。、
三、存儲過程缺點
  1.調試不是很方便。
  2.可能沒有創建存儲過程的權利。
  3.重新編譯問題。
  4.移植性問題。

四、變數

  1.用戶變數:以”@”開始,形式為”@變數名。” 用戶變數跟MySQL客戶端是綁定的,設置的變數,只對當前用戶使用的客戶端生效.
  2.全局變數:定義時,以如下兩種形式出現,set GLOBAL 變數名 或者 set @@global.變數名。show global variables; 對所有客戶端生效。只有super許可權才可以設置全局變數。
  3.會話變數:只對連接的客戶端有效。一旦客戶端失去連接,變數失效。show session variables;
  4.局部變數:作用範圍在begin到end語句塊之間。

    4.1在該語句塊里設置的變數declare語句專門用於定義局部變數。declare numeric number(8,2)【MySQL的數據類型,如:int,float, date, varchar(length)】 default 9.95;

    4.2變數賦值:SET 變數名 = 表達式值 [,variable_name= expression ...],set numeric=1.2或者SELECT 2.3 into @x;

五、mysql 存儲程式

  1.基本語法:create procedure  過程名 ([過程參數[,...]])[特性 ...] 過程體;先看基本例子

  第一種:

delimiter ;;
create procedure proc_on_insert()
begin
end
;;
delimiter

  第二種:

delimiter //
create procedure proc_on_insert()
begin
end
//
delimiter ;;

  註意:

  1).這裡需要註意的是delimiter // 和delimiter ;;兩句,delimiter是分割符的意思,因為MySQL預設以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用delimiter關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼。
  2).存儲過程根據需要可能會有輸入、輸出、輸入輸出參數,這裡有一個輸出參數s,類型是int型,如果有多個參數用","分割開。
  3).過程體的開始與結束使用begin與emd進行標識。

  2..調用存儲過程基本語法:call sp_name()

  3.參數:MySQL存儲過程的參數用在存儲過程的定義,共有三種參數類型,IN,OUT,INOUT,形式如:

    create procedure([[in |out |inout ] 參數名 數據類形...])
    in輸入參數:表示該參數的值必須在調用存儲過程時指定,在存儲過程中修改該參數的值不能被返回,為預設值
    out 輸出參數:該值可在存儲過程內部被改變,並可返回
    inout 輸入輸出參數:調用時指定,並且可被改變和返回

    3.1in參數例子:

drop procedure if exists prc_on_in;
delimiter ;;
create procedure prc_on_in(in num int)
begin
declare number int ;
set number=num;
select number;
end
;;
delimiter ;;
set @num=1;
call prc_on_in(@num);

  3.2out參數創建例子

drop procedure if exists prc_on_out;
delimiter ;;
create procedure prc_on_out(out out_num int)
begin
select out_num;
set out_num=78;
select out_num;
end
;;
delimiter ;;
set @number=6;
call prc_on_out(@number);

  3.3inout參數創建例子

drop procedure if exists prc_on_inout;
delimiter ;;
create procedure prc_on_inout(inout p_inout int)
begin
select p_inout;
set p_inout=100;
select p_inout;
end
;;
delimiter ;;
set @p_out=90;
call prc_on_inout(@p_out);

  3.4存儲過程中的IF語句(if then elseif then else end if)

drop procedure if exists p_else;
create procedure p_else(in id int)
begin
    if (id > 0) then
        select '> 0' as id;
    elseif (id = 0) then
        select '= 0' as id;
    else
        select '< 0' as id;
    end if;
end;
set @p=-10;
call p_else(@p);

  3.5存儲過程中的case when then

drop procedure if exists p_case;
delimiter ;;
create procedure p_case(  
    id int  
)  
begin  
    case id  
    when 1 then     
    select 'one' as trans;  
    when 2 then  
    select 'two' as trans;  
    when 3 then   
    select 'three' as trans;  
    else  
    select 'no trans' as trans;  
    end case;  
end;  
;;
delimiter ;;
set @id=1;
call p_case(@id);

  3.6存儲過程中的while do … end while語句

drop procedure if exists p_while_do;  
create procedure p_while_do()  
begin  
    declare i int;  
        set i = 1;  
        while i <= 10 do  
            select concat('index : ', i) ;  
            set i = i + 1;  
        end while;  
end;  
call p_while_do(); 

  3.7存儲過程中的repeat … until end repeat語句

drop procedure if exists p_repeat;
delimiter ;;
create procedure p_repeat(in parameter int)
BEGIN
     declare var int;  
     set var = parameter; 
     REPEAT
     set var = var - 1; 
     set parameter = parameter -2; 
     UNTIL var<0
     end REPEAT;
     select parameter;
END
;;
delimiter ;; 
set @parameter=1;
call p_repeat(@parameter);

  這個REPEAT迴圈的功能和前面WHILE迴圈一樣,區別在於它的執行後檢查是否滿足迴圈條件(until i>=5),而WHILE則是執行前檢查(while i<5 do)。
  不過要註意until i>=5後面不要加分號,如果加分號,就是提示語法錯誤。

3.8存儲過程中的loop ··· end loop語句

    

drop procedure if exists p_loop;
delimiter;;
create procedure p_loop(in parameter int)
BEGIN
     declare var int;  
     set var = parameter; 
     LOOP_LABLE:loop
     set var = var - 1; 
     set parameter = parameter -2; 
     if var<0 THEN
   LEAVE LOOP_LABLE;
     END IF;
     end LOOP;
     select parameter;
END
;;
delimiter;;
set @parameter=4;
call p_loop(@parameter);

    使用LOOP編寫同樣的迴圈控制語句要比使用while和repeat編寫的要複雜一些:在迴圈內部加入了IF……END IF語句,在IF語句中又加入了LEAVE語句,LEAVE語句的意思是離開迴圈,LEAVE的格式是:LEAVE 迴圈標號。

  4.游標的使用 :定義游標 ,打開游標 ,使用游標 ,關閉游標例子

drop table if exists  person;
CREATE TABLE `person` (
  `id` int(11) NOT NULL DEFAULT '0',
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into person(age) value(1);
drop procedure if exists prc_test1;
delimiter ;;
create definer = root@localhost procedure prc_test1()
BEGIN
    declare var int;   
     /**跳出迴圈標識**/
   declare done INT DEFAULT FALSE;
     /**聲明游標**/
   declare cur cursor for select age from person;
   /**迴圈結束設置跳出標識**/
   declare continue handler for not FOUND set done = true;
   /**打開游標**/
   open cur;
     LOOP_LABLE:loop
        FETCH cur INTO var;
        select var;
     if done THEN
   LEAVE LOOP_LABLE;
     END IF;
     end LOOP;
     /**關閉游標**/
   CLOSE cur;
END;
;;
delimiter ;;
call prc_test1();

5.MySQL存儲過程的查詢

5.1.查看某個資料庫下麵的存儲過程

select name from mysql.proc where db=’資料庫名’;
或者
select routine_name frominformation_schema.routines where routine_schema='資料庫名';
或者
show procedure status where db='資料庫名';

5.2.查看存儲過程的詳細

show create procedure 資料庫.存儲過程名;

6、MySQL存儲過程的修改

ALTER PROCEDURE:更改用CREATE PROCEDURE 建立的預先指定的存儲過程,其不會影響相關存儲過程或存儲功能。

7.刪除存儲過程
drop procedure sp_name //註釋函數名

mysql存儲函數實例下載地址:http://pan.baidu.com/s/1gf1Swk7        密碼:282i


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.背景 寫博客快兩年了,寫了100+的文章,最火的文章也是大家最關註的就是如何實現android系統截屏。其實我們google android_screen_shot就會找到很對辦法,但那些都是很多年前的了,在android4.*版本後,android對於源碼進行了更正,使得以前的方法都不能夠使用 ...
  • 一致性非鎖定讀(consistent nonlocking read) 一致性非鎖定讀是值InnoDB存儲引擎通過多版本控制(multi versioning)的方式來讀取當前執行時間資料庫中的數據。如果被讀的數據行被加了排他鎖,在讀取這行數據的時候並不會等待鎖釋放,而是讀取該行的一個快照數據。 之 ...
  • 在SSIS工程的開發過程中,OLEDB 數據源和目標組件是最常用的數據流組件。從功能上講,OLEDB 數據源組件用於從OLEDB 提供者(Provider)中獲取數據,傳遞給下游組件,OLEDB提供者是外部數據源,SQL Server是其中一種OLEDB提供者;OLEDB目標組件用於把數據流插入到關 ...
  • 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持! 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿蔔 所有。望各位支持! 如果轉載,請註明博文來源: www.cnblog ...
  • 1.使用maven或者其他打包工具將storm-starter打成jar包 2.請將jar包用解壓工具打開在根目錄下找到defaults.yaml文件並將其刪除不然到時會報有multiply defaults.yaml的錯哦 3.用ftp工具將jar包上傳到linux系統主節點上 4.在各個節點上啟 ...
  • 1.註釋語法:--,#2.尾碼是.sql的文件是資料庫查詢文件3.保存查詢4.在資料庫裡面 列有個名字叫欄位 行有個名字叫記錄CRUD操作:create 創建(添加)read 讀取update 修改delete 刪除1、添加數據insert into Info values('p009','張三', ...
  • SQL即結構化查詢語言(Structured Query Language),是一種特殊目的的編程語言,是一種資料庫查詢和程式設計語言,用於存取數據以及查詢、更新和管理關係資料庫系統;同時也是資料庫腳本文件的擴展名。SQL語句無論是種類還是數量都是繁多的,很多語句也是經常要用到的,SQL查詢語句就是 ...
  • mysql批量數據腳本 1 建表 2 設置參數 3 創建函數 a.隨機產生字元串 delimiter $$ create function rand_string(n int) returns varchar(255) begin declare chars_str varchar(100) def ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...