當前位置:首頁 » 存儲配置 » mysql測試存儲過程

mysql測試存儲過程

發布時間: 2022-07-31 18:42:14

㈠ 如何測試mysql觸發器和存儲過程

1.
為了測試觸發器和存儲過程,首先建立一張簡單的表:
復制代碼
代碼如下:
CREATE
TABLE
`airuser`
(
`userId`
int(11)
NOT
NULL
AUTO_INCREMENT,
`username`
varchar(128)
NOT
NULL,
PRIMARY
KEY
(`userId`)
)ENGINE=InnoDB
DEFAULT
CHARSET=utf8
2.
為該表的插入操作,創建一張記錄表:
復制代碼
代碼如下:
CREATE
TABLE
`airuser_record`
(
`id`
int(11)
NOT
NULL
AUTO_INCREMENT,
`username`
varchar(45)
DEFAULT
NULL,
`edittime`
timestamp
NULL
DEFAULT
NULL,
`edittype`
varchar(45)
DEFAULT
NULL,
PRIMARY
KEY
(`id`)
)
ENGINE=InnoDB
DEFAULT
CHARSET=utf8
3.
編寫一個插入操作的觸發器:
復制代碼
代碼如下:
DROP
TRIGGER
insert_trigger;
delimiter
|
CREATE
TRIGGER
insert_trigger
BEFORE
INSERT
ON
airuser
FOR
EACH
ROW
BEGIN
INSERT
INTO
airuser_record
SET
username
=
NEW.username,
edittime=now(),
edittype='insert';
END;
SHOW
TRIGGERS;
4.
為批量插入編寫存儲過程:
復制代碼
代碼如下:
DROP
procere
createUsers;
delimiter
|
create
procere
createUsers(IN
count
int)
begin
declare
i
int;
set
i=0;
while
i<count
do
insert
into
airuser
set
username=concat('user_',i);
set
i=i+1;
end
while;
end;
show
procere
status;
5.
調用存儲過程,驗證存儲過程是工作的,並驗證在插入記錄前,觸發器能正確被觸發:
復制代碼
代碼如下:
call
createUsers(10);
6.
最後通過插入記錄表再次驗證:
復制代碼
代碼如下:
SELECT
*
FROM
mars_jpa.airuser_record;

㈡ mysql存儲過程是什麼意思什麼時候會用到,主要用來做什麼

存儲過程簡單來說,就是為以後的使用而保存的一條或多條MySQL語句的集合。可將其視為批件,雖然它們的作用不僅限於批處理。
存儲過程就是有業務邏輯和流程的集合,
可以在存儲過程中創建表,更新數據,
刪除等等。
你可以理解為用sql語句開發的一個
類和函數。
為什麼要使用存儲過程
通過把處理封裝在容易使用的單元中,簡化復雜的操作(正如前面例子所述)。
由於不要求反復建立一系列處理步驟,這保證了數據的完整性。如果所有開發人員和應用程序都使用同一(試驗和測試)存儲過程,則所使用的代碼都是相同的。這一點的延伸就是防止錯誤。需要執行的步驟越多,出錯的可能性就越大。防止錯誤保證了數據的一致性。
簡化對變動的管理。如果表名、列名或業務邏輯(或別的內容)有變化,只需要更改存儲過程的代碼。使用它的人員甚至不需要知道這些變化。

㈢ mysql存儲過程 in 怎麼用

out 表示輸出的參數,存儲過程調用 代碼 需要獲得此參數值。
in 表示輸入參數,默認為in

例1、一個簡單存儲過程游標實例

復制代碼代碼如下:

DELIMITER $$
DROP PROCEDURE IF EXISTS getUserInfo $$
CREATE PROCEDURE getUserInfo(in date_day datetime)
--
-- 實例
-- 存儲過程名為:getUserInfo
-- 參數為:date_day日期格式:2008-03-08
--
BEGIN
declare _userName varchar(12); -- 用戶名
declare _chinese int ; -- 語文
declare _math int ; -- 數學
declare done int;
-- 定義游標
DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate, date_day)=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- 獲取昨天的日期
if date_day is null then
set date_day = date_add(now(),interval -1 day);
end if;
open rs_cursor;
cursor_loop:loop
FETCH rs_cursor into _userName, _chinese, _math; -- 取數據

if done=1 then
leave cursor_loop;
end if;
-- 更新表
update infoSum set total=_chinese+_math where UserName=_userName;
end loop cursor_loop;
close rs_cursor;

END$$
DELIMITER ;

例2、存儲過程游標循環跳出現
在MySQL的存儲過程中,游標操作時,需要執行一個conitnue的操作.眾所周知,MySQL中的游標循環操作常用的有三種,LOOP,REPEAT,WHILE.三種循環,方式大同小異.以前從沒用過,所以記下來,方便以後查閱.
1.REPEAT

復制代碼代碼如下:

REPEAT
Statements;
UNTIL expression
END REPEAT
demo
DECLARE num INT;
DECLARE my_string VARCHAR(255);
REPEAT
SET my_string =CONCAT(my_string,num,',');
SET num = num +1;
UNTIL num <5
END REPEAT;

2.WHILE

復制代碼代碼如下:

WHILE expression DO
Statements;
END WHILE
demo
DECLARE num INT;
DECLARE my_string VARCHAR(255);
SET num =1;
SET str ='';
WHILE num < span>10DO
SET my_string =CONCAT(my_string,num,',');
SET num = num +1;
END WHILE;
3.LOOP(這裡面有非常重要的ITERATE,LEAVE)
代碼如下 復制代碼
DECLARE num INT;
DECLARE str VARCHAR(255);
SET num =1;
SET my_string ='';
loop_label: LOOP
IF num <10THEN
LEAVE loop_label;
ENDIF;
SET num = num +1;
IF(num mod3)THEN
ITERATE loop_label;
ELSE
SET my_string =CONCAT(my_string,num,',');
ENDIF;
END LOOP;

PS:可以這樣理解ITERATE就是我們程序中常用的contiune,而ITERATE就是break.當然在MySQL存儲過程,需要循環結構有個名稱,其他都是一樣的.
例3,mysql 存儲過程中使用多游標

先創建一張表,插入一些測試數據:

復制代碼代碼如下:

DROP TABLE IF EXISTS netingcn_proc_test;
CREATE TABLE `netingcn_proc_test` (
`id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`password` VARCHAR(20),
PRIMARY KEY (`id`)
)ENGINE=InnoDB;
insert into netingcn_proc_test(name, password) values
('procere1', 'pass1'),
('procere2', 'pass2'),
('procere3', 'pass3'),
('procere4', 'pass4');下面就是一個簡單存儲過程的例子:
drop procere IF EXISTS test_proc;
delimiter //
create procere test_proc()
begin
-- 聲明一個標志done, 用來判斷游標是否遍歷完成
DECLARE done INT DEFAULT 0;
-- 聲明一個變數,用來存放從游標中提取的數據
-- 特別注意這里的名字不能與由游標中使用的列明相同,否則得到的數據都是NULL
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
-- 聲明游標對應的 SQL 語句
DECLARE cur CURSOR FOR
select name, password from netingcn_proc_test;
-- 在游標循環到最後會將 done 設置為 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 執行查詢
open cur;
-- 遍歷游標每一行
REPEAT
-- 把一行的信息存放在對應的變數中
FETCH cur INTO tname, tpass;
if not done then
-- 這里就可以使用 tname, tpass 對應的信息了
select tname, tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur;
end
//
delimiter ;
-- 執行存儲過程
call test_proc();

需要注意的是變數的聲明、游標的聲明和HANDLER聲明的順序不能搞錯,必須是先聲明變數,再申明游標,最後聲明HANDLER。上述存儲過程的例子中只使用了一個游標,那麼如果要使用兩個或者更多游標怎麼辦,其實很簡單,可以這么說,一個怎麼用兩個就是怎麼用的。例子如下:

復制代碼代碼如下:

drop procere IF EXISTS test_proc_1;
delimiter //
create procere test_proc_1()
begin
DECLARE done INT DEFAULT 0;
DECLARE tid int(11) DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
DECLARE cur_1 CURSOR FOR
select name, password from netingcn_proc_test;
DECLARE cur_2 CURSOR FOR
select id, name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_1;
REPEAT
FETCH cur_1 INTO tname, tpass;
if not done then
select tname, tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur_1;
-- 注意這里,一定要重置done的值為 0
set done = 0;
open cur_2;
REPEAT
FETCH cur_2 INTO tid, tname;
if not done then
select tid, tname;
end if;
UNTIL done END REPEAT;
CLOSE cur_2;
end
//
delimiter ;
call test_proc_1();

上述代碼和第一個例子中基本一樣,就是多了一個游標聲明和遍歷游標。這里需要注意的是,在遍歷第二個游標前使用了set done = 0,因為當第一個游標遍歷玩後其值被handler設置為1了,如果不用set把它設置為 0 ,那麼第二個游標就不會遍歷了。當然好習慣是在每個打開游標的操作前都用該語句,確保游標能真正遍歷。當然還可以使用begin語句塊嵌套的方式來處理多個游標,例如:

復制代碼代碼如下:

drop procere IF EXISTS test_proc_2;
delimiter //
create procere test_proc_2()
begin
DECLARE done INT DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
DECLARE cur_1 CURSOR FOR
select name, password from netingcn_proc_test;
DECLARE cur_2 CURSOR FOR
select id, name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_1;
REPEAT
FETCH cur_1 INTO tname, tpass;
if not done then
select tname, tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur_1;
begin
DECLARE done INT DEFAULT 0;
DECLARE tid int(11) DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE cur_2 CURSOR FOR
select id, name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_2;
REPEAT
FETCH cur_2 INTO tid, tname;
if not done then
select tid, tname;
end if;
UNTIL done END REPEAT;
CLOSE cur_2;
end;
end
//
delimiter ;
call test_proc_2();

㈣ navicat 怎樣調試mysql存儲過程

navicat 怎樣調試mysql存儲過程
使用Navicat for MySQL工具創建存儲過程步驟:
1. 新建函數(選擇函數標簽 -> 點擊新建函數):

2、輸入函數的參數個數、參數名、參數類型等:

3、編寫存儲過程:

4、保存(請輸入合法名稱):

5、運行存儲過程(在結果1,2,3...中可以查詢輸出信息):

㈤ MySql編寫一個存儲過程

1、delimiter // ,聲明分隔符:DELIMITER是分割符的意思,因為MySQL默認以";"為分隔符,如果我們沒有聲明分割符,那麼編譯器會把存儲過程當成SQL語句進行處理,則存儲過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做存儲過程中的代碼,不會執行這些代碼(這里如果不懂的話,你可以通過試錯的方法來理解)。
2、編寫存儲過程的格式:CREATE PROCEDURE([[IN |OUT |INOUT ]參數名數據類形...])
例子:
1)create procere proc1(out s int) // 只有輸出
2)create procere proc2(in p_in bigint) // 只有輸入
3)create procere proc15() // 沒有輸入與輸出
4)create procere demo_multi_param(in id bigint,in name varchar(32),out c int) //多輸入與輸出
3、過程體的開始與結束使用BEGIN與END進行標識。
4、select count (*) into s from student; // 過程體,一系列的邏輯語句,sql語句
5、delimiter ; 用完了之後要把分隔符還原。

㈥ 關於mysql存儲過程

create table mytb
(tid int,
subject varchar(100),
content varchar(100))

eg:測試數據:
20 計算機應用 應用軟體開發
21 計算機操作系統 操作系統詳解
22 c# c#開發實戰
=======================================
說明一點:tid編號是連續的,如(1,2,3,4···)

存儲過程如下,測試通過:

create proc my_search
@beg_id int ,
@end_id int
as

declare @names varchar(200),
@bcp varchar(8000)
if(@beg_id<@end_id)
begin

while @beg_id<=@end_id
begin
select @names=subject from mytb where tid=@beg_id
set @bcp = 'bcp "SELECT content FROM 資料庫名.dbo.mytb where tid = ' + rtrim(@beg_id) + '" queryout "E:\11\' + rtrim(@names) + '.txt" -c -U"sa" -P"sa"'

EXEC master..xp_cmdshell @bcp
set @beg_id=@beg_id+1
end
end

==================加路徑後過程==============

--exec my_search 20,21,'E:\11'

ALTER proc my_search
@beg_id int ,
@end_id int ,
@path varchar(200)
as

if(right(@path,1)='\')
begin
set @path=left(@path,len(@path)-1)
end

declare @names varchar(200),
@bcp varchar(8000)
if(@beg_id<@end_id)
begin

while @beg_id<=@end_id
begin
select @names=subject from mytb where tid=@beg_id
set @bcp = 'bcp "SELECT content FROM cdma.dbo.mytb where tid = ' + rtrim(@beg_id) + '" queryout "'+@path+'\' + rtrim(@names) + '.txt" -c -U"sa" -P"sa"'

EXEC master..xp_cmdshell @bcp
set @beg_id=@beg_id+1
end
end

=======
呵呵,很抱歉啊 樓主,沒能實現你的要求,
MSSQL我不熟,我想語法大概也是差不多吧,

㈦ mysql存儲過程的基本用法有哪些

mysql存儲過程的基本用法有哪些
在外部程序訪問資料庫時(例如 PHP),要組織很多 SQL 語句。

特別是業務邏輯復雜的時候,一大堆的 SQL 和條件夾雜在 PHP 代碼中,讓人不寒而慄。現在有了 MySQL 存儲過程,業務邏輯可以封裝存儲過程中,這樣不僅容易維護,而且執行效率也高。

一、MySQL 創建存儲過程

"pr_add" 是個簡單的 MySQL 存儲過程,這個MySQL 存儲過程有兩個 int 類型的輸入參數 "a"、"b",返回這兩個參數的和。
復制代碼 代碼如下:
drop procere if exists pr_add;

計算兩個數之和
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
select c as sum;
/*
return c;
不能在 MySQL 存儲過程中使用。return 只能出現在函數中。

*/
end;

二、調用 MySQL 存儲過程
復制代碼 代碼如下:
call pr_add(10, 20);

執行 MySQL 存儲過程,存儲過程參數為 MySQL 用戶變數。
復制代碼 代碼如下:
set @a = 10;
set @b = 20;
call pr_add(@a, @b);

三、MySQL 存儲過程特點

創建 MySQL 存儲過程的簡單語法為:
復制代碼 代碼如下:
create procere 存儲過程名字()
(
[in|out|inout] 參數 datatype
)
begin
MySQL 語句;
end;

MySQL 存儲過程參數如果不顯式指定"in"、"out"、"inout",則默認為"in"。習慣上,對於是"in" 的參數,我們都不會顯式指定。

1. MySQL 存儲過程名字後面的"()"是必須的,即使沒有一個參數,也需要"()"

2. MySQL 存儲過程參數,不能在參數名稱前加"@",如:"@a int"。下面的創建存儲過程語法在 MySQL 中是錯誤的(在 SQL Server 中是正確的)。 MySQL 存儲過程中的變數,不需要在變數名字前加"@",雖然 MySQL 客戶端用戶變數要加個"@"。
復制代碼 代碼如下:
create procere pr_add
(
@a int, -- 錯誤
b int -- 正確
)

3. MySQL 存儲過程的參數不能指定默認值。

4. MySQL 存儲過程不需要在 procere body 前面加 "as"。而 SQL Server 存儲過程必須加 "as" 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
as -- 錯誤,MySQL 不需要 "as"
begin
mysql statement ...;
end;

5. 如果 MySQL 存儲過程中包含多條 MySQL 語句,則需要 begin end 關鍵字。
復制代碼 代碼如下:
create procere pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;

6. MySQL 存儲過程中的每條語句的末尾,都要加上分號 ";"
復制代碼 代碼如下:
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;

7. MySQL 存儲過程中的注釋。
復制代碼 代碼如下:
/*
這是個
多行 MySQL 注釋。
*/
declare c int; -- 這是單行 MySQL 注釋 (注意 -- 後至少要有一個空格)
if a is null then # 這也是個單行 MySQL 注釋
set a = 0;
end if;

㈧ 在MYSQL中使用存儲過程要設置什麼地方嗎解決辦法

幾個去 IBM 面試的兄弟回來抱怨:去了好幾個不同的 IBM
項目組,幾乎每個面試官問到資料庫的時候都要問用沒用過存儲過程,煩人不?大家去面的程序員,又不是
筆者認為,存儲過程說白了就是一堆 SQL 的合並。中間加了點邏輯控制。
但是存儲過程處理比較復雜的業務時比較實用。
比如說,一個復雜的數據操作。如果你在前台處理的話。可能會涉及到多次資料庫連接。但如果你用存儲過程的話。就只有一次。從響應時間上來說有優勢。
也就是說存儲過程可以給我們帶來運行效率提高的好處。
另外,程序容易出現 BUG
數據量小的,或者和錢沒關系的項目不用存儲過程也可以正常運作。mysql 的存儲過程還有待實際測試。如果是正式項目,建議你用 sql
server 或 oracle
的存儲過程。數據與數據之間打交道的話,過程會比程序來的快的多。面試官問有沒有用存儲,實際上就是想知道前來面試的程序員到底做過數據量大的項目沒。如
果是培訓出來的,或者小項目小公司出來的,對存儲肯定接觸的少了。
所以,要想進大公司,沒有豐富存儲過程經驗,是不行的。
錯。存儲過程不僅僅適用於大型項目,對於中小型項目,使用存儲過程也是非常有必要的。其威力和優勢主要體現在:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般 SQL
語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.當對資料庫進行復雜操作時(如對多個表進行
Update,Insert,Query,Delete
時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL
語句,可能要多次連接資料庫。而換成存儲,只需要連接一次資料庫就可以了。
3.存儲過程可以重復使用,可減少資料庫開發人員的工作量。
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。存儲過程的缺點
1:調試麻煩,但是用 PL/SQL Developer 調試很方便!彌補這個缺點。
2:移植問題,資料庫端代碼當然是與資料庫相關的。但是如果是做工程型項目,基本不存在移植問題。
3:重新編譯問題,因為後端代碼是運行前編譯的,如果帶有引用關系的對象發生改變時,受影響的存儲過程、包將需要重新編譯(不過也可以設置成運行時刻自動編譯)。
4:如果在一個程序系統中大量的使用存儲過程,到程序交付使用的時候隨著用戶需求的增加會導致數據結構的變化,接著就是系統的相關問題了,最後如果用戶想維護該系統可以說是很難很難、而且代價是空前的。維護起來更加麻煩

熱點內容
移動寬頻設置路由器怎麼設置密碼 發布:2024-10-05 20:03:30 瀏覽:105
微指令的編譯方法有哪一些 發布:2024-10-05 19:02:10 瀏覽:885
android離線定位 發布:2024-10-05 18:36:40 瀏覽:858
ipad4密碼忘記怎麼辦 發布:2024-10-05 18:36:07 瀏覽:237
黑莓加密天線 發布:2024-10-05 18:30:07 瀏覽:849
編程入行年齡 發布:2024-10-05 18:29:24 瀏覽:539
伺服器地址訪問不到 發布:2024-10-05 18:20:55 瀏覽:690
手機解鎖忘記密碼多少錢 發布:2024-10-05 18:14:25 瀏覽:787
linux亂碼問題 發布:2024-10-05 18:00:25 瀏覽:543
訪客儀需要電腦做伺服器嗎 發布:2024-10-05 17:57:57 瀏覽:11