亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

窺探mysql存儲過程細節(jié)

 更新時間:2016年03月23日 15:51:06   作者:跡憶  
這篇文章主要為大家詳細介紹了mysql存儲過程細節(jié),對mysql存儲過程感興趣的小伙伴們可以參考一下

存儲過程,可以這樣認為,將我們需要特殊處理的sql語句封裝成函數(shù),當需要的時候我們只需調(diào)用這個函數(shù)就可以實現(xiàn)我們想要的操作,這個過程我們可以稱之為存儲過程。當然了,真正存儲過程的定義不是這樣的。但是我們可以這樣簡單的去理解存儲過程。

下面我們看一個簡單的使用存儲過程的例子。

首先我們新建一張表 proced:

create table proced(
     id int(5) primary key auto_increment,
     name varchar(50),
     type varchar(50)
);

然后我們需要向這個表中插入10萬條數(shù)據(jù),這個時候我們需要借助存儲過程來實現(xiàn)這一功能。

mysql> delimiter //
mysql> create procedure adddata()
     -->begin
     -->declare n int default 0;
     -->while n<100000
     -->do
     -->insert into proced(name,type) values(‘跡憶博客','onmpw');
     -->set n = n+1;
     -->end while;
     -->end
     -->//
mysql> delimiter ;
mysql> call adddata();

使用上述存儲過程,我們就可以向proced表中插入10萬條數(shù)據(jù)了。

借助上述小例子,我們來講一下如何創(chuàng)建一個存儲過程。

創(chuàng)建存儲過程

首先我們來看一下創(chuàng)建存儲過程的語法:

CREATE PROCEDURE procedure_name(IN/OUT/INOUT parameter TYPE)
BEGIN
     procedure_body
END

這個過程比較簡單。

在上面的小例子中我們看到在創(chuàng)建存儲過程之前使用了delimiter //;,創(chuàng)建完成之后又再次 使用了命令 delimiter ;。

delimiter 是界定符,我們知道,在mysql命令行客戶端,是通過分號(;)來界定一個命令是否完成的。在存儲過程中,我們會多次使用到分號,但是這并不代表命令的結(jié)束,所以說我們需要使用delimiter命令來改變這個界定符。

mysql> delimiter //;  改變界定符為 //
mysql> delimiter ; 重新改變界定符為分號

所以說我們?nèi)绻褂胢ysql命令行創(chuàng)建存儲過程的話,我們必須在創(chuàng)建存儲過程之前使用上述命令改變界定符。

接下來我們看到procedure_name()中的IN/OUT/INOUT,這是代表什么意思呢?

一個IN類型的參數(shù)會傳遞一個值到存儲哦過程中,也就是我們在編程語言中自定義函數(shù)的參數(shù)。如果參數(shù)前面沒有指定是IN/OUT/INOUT,那默認會是IN,看下面的例子:

mysql>delimiter //
mysql> create procedure in_proced(IN param VARCHAR(100))
      -->begin
      -->insert into proced(name,type) values(param,'onmpw');
      -->end
      -->//
mysql>delimiter ;
mysql> call in_proced(‘onmpw.com');

這就是在參數(shù)前指定IN的含義。

下面我們看OUT,指定為OUT的參數(shù)將從存儲過程中傳遞一個值給調(diào)用者,也就是說,OUT可以認為這個參數(shù)就是我們自定義函數(shù)中的返回值。

mysql> delimiter //
mysql> create procedure out_proced(OUT param INT)
     -->begin
     -->select count(*) into param from proced;
     -->end
     -->//
mysql>delimiter ;
mysql> call out_proced(@a);
mysql>select @a;
+------+
| @a |
+------+
| 3   |
+------+

最后就是INOUT,很明顯INOUT指定的參數(shù)被調(diào)用者初始化,其值在存儲過程中可以被修改,并且任何改變對于調(diào)用者來說都是可見的。

看下面的例子:

mysql> delimiter //
mysql> create procedure inout_proced(INOUT param INT)
     --> begin
     --> select count(*) into param from proced where id>param;
     --> end
     -->//
mysql>delimiter ;
mysql>set @a = 3;
mysql>call inout_proced(@a);
mysql>select @a; 查看變量的值是否改變

以上就是創(chuàng)建一個簡單的存儲過程的方式。

刪除存儲過程

刪除存儲過程的語法:

DROP PROCEDURE IF EXISTS procedure_name

下面是使用實例:

mysql>drop procedure if exists proced;

修改存儲過程

存儲過程的修改時不能改變存儲過程內(nèi)的sql語句的,只能改變其屬性,其語法如下:

ALTER PROCEDURE proc_name [characteristic ...]

characteristic:
  COMMENT 'string'
  | LANGUAGE SQL
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }

總結(jié):無論是刪除存儲過程還是修改存儲過程,必須保證你要修改或者刪除存儲過程沒有被其他存儲過程使用,例如你有存儲過程A,和存儲過程B。A在B中被使用,如果我們想修改A或者刪除A,必須確保B中不再使用A,否則如果我們刪除A以后,再調(diào)用B的時候就會報錯。

舉個例子:

mysql>delimiter //
mysql>create procedure A(IN pa1 INT,OUT pa2 INT)
     -->begin
     -->select count(*) into pa2 from proced where id>pa1;
     -->end
     -->//
mysql>create procedure B(INOUT pa INT)
     -->begin
     -->declare v int;
     -->call A(pa,v);
     -->set pa = v;
     -->end
     -->//
mysql>delimiter ;
mysql>drop procedure A;
mysql>set @a=5;
mysql>call B(@a);
ERROR 1305 (42000): PROCEDURE test.A does not exists

以上就是對存儲過程簡單的介紹,希望對大家學習mysql存儲過程有所幫助。

相關(guān)文章

  • MySQL主從復制延時問題的解決方案

    MySQL主從復制延時問題的解決方案

    MySQL主從一直是面試常客,里面的知識點雖然基礎(chǔ),但是能回答全的同學不多,如果我們遇到問如何解決MySQL主從復制延時問題呢,所以本文給大家講解了MySQL主從復制延時問題的解決方法,需要的朋友可以參考下
    2023-12-12
  • MySQL插入不了中文數(shù)據(jù)問題的原因及解決

    MySQL插入不了中文數(shù)據(jù)問題的原因及解決

    最近發(fā)現(xiàn)新安裝的MySQL數(shù)據(jù)庫不能插入中文字段,所以下面這篇文章主要給大家介紹了關(guān)于MySQL插入不了中文數(shù)據(jù)問題的原因及解決方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • MySQL8.0.32的安裝與配置超詳細圖文教程

    MySQL8.0.32的安裝與配置超詳細圖文教程

    這篇文章主要介紹了MySQL8.0.32的安裝與配置超詳細圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • mysql實現(xiàn)遞歸查詢的方法示例

    mysql實現(xiàn)遞歸查詢的方法示例

    本文主要介紹了mysql實現(xiàn)遞歸查詢的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • MySQL 在觸發(fā)器里中斷記錄的插入或更新?

    MySQL 在觸發(fā)器里中斷記錄的插入或更新?

    MySQL 不象其它有些數(shù)據(jù)庫可以在觸發(fā)器中拋出異常來中斷當然觸發(fā)器的執(zhí)行以阻止相應(yīng)的SQL語句的執(zhí)行。在MySQL的目錄版本中還無法直接拋出異常。這樣我們?nèi)绾螌崿F(xiàn)呢?
    2009-07-07
  • 淺談MySQL存儲過程中declare和set定義變量的區(qū)別

    淺談MySQL存儲過程中declare和set定義變量的區(qū)別

    下面小編就為大家?guī)硪黄獪\談MySQL存儲過程中declare和set定義變量的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • 實現(xiàn)MySQL回滾的Python腳本的編寫教程

    實現(xiàn)MySQL回滾的Python腳本的編寫教程

    這篇文章主要介紹了實現(xiàn)MySQL回滾的Python腳本的編寫教程,文中的回滾針對的是DELETE語句的數(shù)據(jù)庫誤操作,需要的朋友可以參考下
    2015-11-11
  • mysql數(shù)據(jù)庫忘記管理員密碼的解決方法

    mysql數(shù)據(jù)庫忘記管理員密碼的解決方法

    我們在Windows操作系統(tǒng)下編程會使用到MySQL數(shù)據(jù)庫。但是有時,我們會忘記數(shù)據(jù)庫的登錄密碼?當我們忘記了登錄密碼,無法進入mysql時,該怎么辦呢?這里我們提供mysql的登錄秘密的修改
    2018-02-02
  • MySQL主從同步原理介紹

    MySQL主從同步原理介紹

    這篇文章主要介紹了MySQL主從同步原理介紹,本文講解了主從同步概述、主從同步需求、主從同步過程等內(nèi)容,需要的朋友可以參考下
    2015-07-07
  • MySQL修改字段類型之modify詳解

    MySQL修改字段類型之modify詳解

    這篇文章主要介紹了MySQL修改字段類型之modify詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論