国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php存儲例程、存儲過程入門教程

2024-05-04 21:48:50
字體:
來源:轉載
供稿:網友

什么是存儲例程?

存儲例程是存儲在數據庫教程服務器中的一組sql語句,通過在查詢中調用一個指定的名稱來執行這些sql語句命令。

為什么要使用存儲過程?

我們都知道應用程序分為兩種,一種是基于web,一種是基于桌面,他們都和數據庫進行交互來完成數據的存取工作。假設現在有一種應用程序包含了這兩種,現在要修改其中的一個查詢sql語句,那么我們可能要同時修改他們中對應的查詢sql語句,當我們的應用程序很龐大很復雜的時候問題就出現這,不易維護!另外把sql查詢語句放在我們的web程序或桌面中很容易遭到sql注入的破壞。而存儲例程正好可以幫我們解決這些問題。

存儲過程(stored procedure)、存儲例程(store routine)、存儲函數區別

Mysql存儲例程實際包含了存儲過程和存儲函數,它們被統稱為存儲例程。

其中存儲過程主要完成在獲取記錄或插入記錄或更新記錄或刪除記錄,即完成select insert delete update等的工作。而存儲函數只完成查詢的工作,可接受輸入參數并返回一個結果。

創建存儲過程、存儲函數

create procedure 存儲過程名(參數)

存儲過程體

create function 存儲函數名(參數)

存儲函數體

假設現在有一個數據庫omcmc中的表db_info 表結構如下:

  1. SET FOREIGN_KEY_CHECKS=0; 
  2. -- ---------------------------- 
  3. -- Table structure for db_news 
  4. -- ---------------------------- 
  5. DROP TABLE IF EXISTS `db_news`; 
  6. CREATE TABLE `db_news` ( 
  7.   `id` int(10) NOT NULL auto_increment, 
  8.   `title` varchar(200) NOT NULL
  9.   `editor` varchar(20) default NULL
  10.   `origin` varchar(20) default NULL
  11.   `tags` varchar(200) default NULL
  12.   `content` text NOT NULL
  13.   `hits` int(10) default '0'
  14.   `ip` varchar(15) NOT NULL
  15.   `timeint(10) NOT NULL
  16.   PRIMARY KEY  (`id`) 
  17. ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; 
  18. -- ---------------------------- 
  19. -- Records  
  20. -- ---------------------------- 
  21. INSERT INTO `db_news` VALUES ('1'First App', 'xqbar.com', 'xqbar.com', 'omcmc', 'detail。。', '100', '127.0.0.1', '1215051225'); 

使用上面的表我們創建一個簡單的存儲過程

create procedure select_news()

select title,hits from db_news;

在終端運行并調用.

調用存儲過程

call 存儲過程名();

以上我們創建了一個簡單的存儲過程,當然我們的應用程序不可能使用這么簡單的存儲過程,我們需要的是能給存儲過程傳遞參數,以返回給我們所需要的結果數據。下面就了解下存儲過程的參數。

存儲過程的參數

通常存儲過程接受用戶的參數,返回結果給調用用戶.

mysql教程規定對于存儲過程的參數要求其每個參數都必須聲明其參數名,數據類型以及該參數是輸入參數還是用于返回信息還是兩者兼有,對于存儲函數php只支持輸入參數.

聲明參數時規定要使用關鍵字IN,OUT,INOUT.

其中:

IN:用于輸入參數

OUT:用于返回參數

INOUT:用于向存儲過程傳遞參數值,如果該值改變則返回

另外規定對于聲名為OUT,INOUT的參數當我們調用存儲過程時需要在參數名前加@,以確保參數在過程外調用,下面我們修改上面的存儲過程以傳遞信息編號給存儲過程select_news,返回對應的信息標題給我們查看.

drop procedure if exists select_news;

create procedure select_news(IN id int,OUT title varchar(200))

select db_news.title from db_news where db_news.id=id;

在終端運行并調用.

注意調用格式

call select_news(1,@title);

其中1是我們要傳入的信息編號,title是要返回的對應信息編號標題,由于是OUT所以再調用時要在其前加@在過程外調用,(見下例)

  1. drop procedure if exists getNum; 
  2. create procedure getNum(OUT num int) 
  3. select 100 into num; 
  4. call getNum(@num); 
  5. select @num; 

php存儲例程、存儲過程進階學習之二

接著上篇文章,再調用有返回值時上個例子我們可以使用以下的方法調用存儲過程:

select @返回參數;

我們現在使用這個方法來調用上面我們創建的select_news,來看看

有人會疑問為什么返回的title是null,而不是像call select_news(1,@title)一樣返回的是我們數據庫編號對應的數據First App,這是由于我們的存儲過程體并沒有給title返回參數返回值。

下面我們來看看存儲函數

仍然以db_news表為例說明,不過我們在這個存儲函數中我們加入其他一些關于存儲例程的知識來引入我們這次要談及的學習對象.

  1. drop function if exists count_news; 
  2. delimiter // 
  3. create function count_news(hits int) returns int 
  4. comment '根據傳入的點擊次數統計超過此點擊數的信息數目' 
  5. begin//開源代碼Vevb.com 
  6.    declare total_news int; 
  7.    declare hits_num int default 0; 
  8.    if hits>=0 then 
  9.       set hits_num=hits; 
  10.       select count(id) into total_news from db_news where db_news.hits>hits_num; 
  11.   else 
  12.      set total_news=0; 
  13.    end if
  14.    return total_news; 
  15. end
  16. // 
  17. delimiter ; 

在上面的存儲函數中我們使用到了存儲例程變量的聲明、設置其值、判斷語句、存儲函數特有的返回值類型及存儲例程如何描述(comment).

與存儲過程返回參數不同的是存儲函數在定義時沒用直接聲明哪個變量是返回參數,而只是使用了returns聲明了返回參數所屬的數據類型,返回參數是在函數體中使用return返回要返回的數據變量的形式來表示的。這就需要注意的是:

存儲函數只支持輸入參數,并且輸入參數前沒有IN或INOUT.

返回上面的存儲函數,我們來解釋下代碼含義:

drop function if exists count_news;

如果存在存儲函數count_news則刪除該存儲函數,與存儲過程一樣我們可以使用下面的語句刪除存儲過程或函數

drop procedure|function [if exists] 存儲過程名|存儲函數名; 

delimiter //

使用delimiter更改mysql默認使用分號(;)使用新的結束符號來結束當前語句,使用delimiter后原先默認的分號(;)結束語句符號不再起作用,直到重新恢復聲明結束符后。

create function count_news(hits int) returns int

注意存儲函數的參數只有輸入參數并且前不再聲明IN或INOUT,返回只需聲明要返回的數據類型

comment '根據傳入的點擊次數統計超過此點擊數的信息數目'

使用comment 來描述該存儲過程或存儲函數的功能信息。使用格式為 comment '描述字符串 '

begin

使用begin限定一個處理模塊

declare total_news int;

聲明變量 格式 declare 變量名 數據類型 [default 默認值]

declare hits_num int default 0;

聲明變量 格式 declare 變量名 數據類型 [default 默認值]

if hits>=0 then

set hits_num=hits;

使用set 給變量賦值

select count(id) into total_news from db_news where db_news.hits>hits_num;

sql語句可以使用into給變量賦值

else

set total_news=0;

end if;

上面是一個判斷語句,注意格式為if-else-end if 或者 if –else if-else-end if

注意分號(;)

return total_news;

使用return 返回存儲函數要返回的值,注意該值只能是一個值.

end;

//

delimiter ;

綜合一下我們上面的概念知識:

1. 存儲函數的參數與存儲過程有何不同。

2. 在存儲例程中如何更改mysql的默認結束符號。

3. 在存儲例程中如何描述功能信息。

4. 聲明、設置變量。

5. begin-end語句塊。

6. 條件判斷if-else if-else-end if 或if-else-end if 或者if-end if

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 民乐县| 鄄城县| 磐安县| 河津市| 临安市| 石景山区| 肥西县| 类乌齐县| 即墨市| 马龙县| 日喀则市| 云浮市| 巴彦淖尔市| 永清县| 镇平县| 永顺县| 抚州市| 屏边| 日土县| 乐陵市| 新河县| 永吉县| 西华县| 隆昌县| 安新县| 灵宝市| 菏泽市| 长乐市| 鄢陵县| 兰州市| 鄄城县| 屏南县| 水城县| 韶关市| 陆川县| 嘉定区| 中江县| 浏阳市| 瓮安县| 辽宁省| 滦南县|