軟件測試中Mysql存儲過程實例

發表于:2010-07-19來源:作者:點擊數: 標簽:軟件測試MYsqlMySQLMysqlmysql
軟件 測試 中Mysql存儲過程實例 實例說明 為了保證數據的完整性、一致性,提高應用的 性能 ,常采用存儲過程技術。 MySQL 5.0之前的版本并不支持存儲過程,隨著MySQL技術的日趨完善,存儲過程將在以后的項目中得到廣泛的應用。本實例將介紹在MySQL 5.0以后的

軟件測試中Mysql存儲過程實例

實例說明
為了保證數據的完整性、一致性,提高應用的性能,常采用存儲過程技術。MySQL 5.0之前的版本并不支持存儲過程,隨著MySQL技術的日趨完善,存儲過程將在以后的項目中得到廣泛的應用。本實例將介紹在MySQL 5.0以后的版本中創建存儲過程。
技術要點
一個存儲過程包括名字、參數列表,以及可以包括很多SQL語句的SQL語句集。下面為一個存儲過程的定義過程:
create procedure proc_name (in parameter integer)
begin
declare variable varchar(20);
if parameter=1 then
set variable='MySQL';
else
set variable='PHP';
end if;
insert into tb (name) values (variable);
end;  
    MySQL中存儲過程的建立以關鍵字create procedure開始,后面緊跟存儲過程的名稱和參數。MySQL的存儲過程名稱不區分大小寫,例如PROCE1()和proce1()代表同一個存儲過程名。存儲過程名不能與MySQL數據庫中的內建函數重名。
    存儲過程的參數一般由3部分組成。第一部分可以是in、out或inout。in表示向存儲過程中傳入參數;out表示向外傳出參數;inout表示定義的參數可傳入存儲過程,并可以被存儲過程修改后傳出存儲過程,存儲過程默認為傳入參數,所以參數in可以省略。第二部分為參數名。第三部分為參數的類型,該類型為MySQL數據庫中所有可用的字段類型,如果有多個參數,參數之間可以用逗號進行分割。
    MySQL存儲過程的語句塊以begin開始,以end結束。語句體中可以包含變量的聲明、控制語句、SQL查詢語句等。由于存儲過程內部語句要以分號結束,所以在定義存儲過程前應將語句結束標志“;”更改為其他字符,并且該字符在存儲過程中出現的幾率也應該較低,可以用關鍵字delimiter更改。例如:
mysql>delimiter //
存儲過程創建之后,可用如下語句進行刪除,參數proc_name指存儲過程名。
drop procedure proc_name
實現過程
(1)MySQL存儲過程是在“命令提示符”下創建的,所以首先應該打開“命令提示符”窗口。
(2)進入“命令提示符”窗口后,首先應該登錄MySQL數據庫服務器,在“命令提示符”下輸入如下命令:
(3)更改語句結束符號,本實例將語句結束符更改為“//”。代碼如下:
(4)創建存儲過程前應首先選擇某個數據庫。代碼如下:
(5)創建存儲過程。
(6)通過call語句調用存儲過程。
## **********first test,procedure**********
#<1>
use testprocedure;

delimiter //


create procedure simpleproce1 (out par1 int)
begin
select count(*) into par1 from proce;
end
//

delimiter ;
call simpleproce1(@a);

select @a;

#<2>,每次只有單一的行可以被取回select id,name into par1,par2 from proce LIMIT 1;中的LIMIT 1;

use testprocedure;

delimiter //

DROP procedure IF EXISTS simpleproce2

create procedure simpleproce2 (out par1 int,out par2 char(30))
begin
select id,name into par1,par2 from proce LIMIT 1;
end
//

delimiter ;
call simpleproce2(@a,@b);

select @a,@b;


## *********second test,function************
#<3>
delimiter //

DROP FUNCTION IF EXISTS hello
//

create function hello(s char(20)) returns char(50)
return concat('Hello, ',s,'!');
//

delimiter ;
select hello('world');

show create function testprocedure.hello\G

#它返回子程序的特征,如數據庫,名字,類型,創建者及創建和修改日期
show function status like 'hello'\G

#<4>
#注意name不能和字段名相同
delimiter //
DROP procedure IF EXISTS test //

CREATE PROCEDURE test ()
BEGIN
    DECLARE name VARCHAR(5) DEFAULT 'bob';
    DECLARE newname VARCHAR(5);
    DECLARE xid INT;
   
    SELECT name,id INTO newname,xid
      FROM proce WHERE name = name;
    SELECT newname;
END;
//

call test1() //

#***
delimiter //
DROP procedure IF EXISTS test2 //

CREATE PROCEDURE test2 ()
BEGIN
   
    DECLARE newname VARCHAR(5);
    DECLARE xid INT;
   
    SELECT name,id INTO newname,xid
      FROM proce limit 1;
    SELECT newname,xid;
END;
//

call test2() //

#<5>
use testprocedure;
CREATE PROCEDURE p1 () SELECT * FROM proce;

call p1();

#<6>注意此處的handler是設置SQLSTATE值,SQLWARNING是對所有以01開頭的SQLSTATE代碼的速記
#NOT FOUND是對所有以02開頭的SQLSTATE代碼的速記
#SQLEXCEPTION是對所有沒有被SQLWARNING或NOT FOUND捕獲的SQLSTATE代碼的速記
#DECLARE CONTINUE HANDLER聲明CONTINUE異常處理
#事實上這里的23000SQLSTATE是更常用的,當外鍵約束出錯或主鍵約束出錯就被調用了。
#當沒有發生該23000異常時, select @x2的值將是null,而不是1,
#并且后面的第2個語句執行時將會報主鍵約束錯誤,此時@x2=1,@x=4,雖然第2句有了異常,但是后面的語句繼續執行
#保存到數據的數據是3,test3和5,test5

use testprocedure;
delimiter //
DROP procedure IF EXISTS handlerdemo
//

create procedure handlerdemo()
begin
declare continue handler for sqlstate '23000' set @x2=1;
set @x=1;
insert into proce values(3,'test3');
set @x=2;
insert into proce values(3,'test4');
set @x=3;
insert into proce values(5,'test5');
set @x=4;
end;
//

call handlerdemo()//

select @x //
select @x2 //

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97