1. 程式人生 > 其它 >報文資訊轉換器

報文資訊轉換器

儲存過程的使用

(一)概念

1. 儲存過程(Stored Procedure)是一種在資料庫中儲存複雜程式,以便外部程式呼叫的一種資料庫物件。類似於java中的方法。
2. 儲存過程是為了完成特定功能的SQL語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數(需要時)來呼叫執行。
3. 儲存過程思想上很簡單,就是資料庫 SQL 語言層面的程式碼封裝與重用。

(二)優點

1. 儲存過程在建立的時候直接編譯,而sql語句每次使用都要編譯,提高執行效率
2. 一個儲存過程可以被重複使用.提高程式碼的複用性
3. 一條sql語句,可能需要訪問幾張表,對資料庫連線好幾次,儲存過程只會連線一次
4. 儲存的程式是安全的。資料庫管理員可以向訪問資料庫中儲存過程的應用程式授予適當的許可權,而不向基礎資料庫表提供任何許可權。

(三)缺點

1. 可移植性太差了(把特有的語句轉換為通用的寫法)
2. 對於簡單的sql語句,毫無意義
3. 對於只有一類使用者的系統安全性毫無意義
4. 團隊開發,標準不定好的話,後期維護很麻煩
5. 對於開發和除錯都很不方便
6. 複雜的業務邏輯,用儲存過程還是很吃力的

(四)建立儲存過程語法

語法:
	CREATE PROCEDURE sp_name (引數型別 引數名  資料型別 ,...) 
	BEGIN           
		SQL語句集合;              	        
	END

說明:
	sp_name :儲存過程名字
	BEGIN ... END: 儲存過程開始和結束符號 
	引數型別:引數型別可以是以下三種[ IN | OUT | INOUT ]:
					IN 輸入引數:表示呼叫者向過程傳入值
					OUT 輸出引數:表示過程向呼叫者傳出值
					INOUT 輸入輸出引數:既表示呼叫者向過程傳入值,又表示過程向呼叫者傳出值

(五)案例

1. 建立無引數儲存過程
呼叫儲存過程
	語法:call 儲存過程名;
#1. 建立無引數儲存過程  查詢user表中的資料
    
    
CREATE PROCEDURE p1()
BEGIN
		select username,password from user;
END;


#呼叫儲存過程
CALL p1;
#刪除儲存過程
DROP PROCEDURE p1;   
2. IN(輸入)引數儲存過程
說明: IN 表示這個儲存過程需要的輸入引數 
    
    
    
CREATE PROCEDURE p2(in param1 int,in param2 varchar(30))
BEGIN
	select * from user where uid = param1;
END;

call p2(3,'張三'); 
3. out(輸出)引數儲存過程說明
說明:out表示這個儲存過程需要的輸出引數 
    
    
create PROCEDURE p3(out param1 int)
BEGIN
		select count(*) into param1 from myemployees.employees;
END;  


#定義會話變數
set @a = 0;
#接收輸出引數的值
call p3(@a);
#顯示變數 @a
select @a;
4. inout引數儲存過程說明
說明:inout是可以接受一個引數並輸出一個引數


CREATE PROCEDURE p4(inout param1 int)
BEGIN
	select count(*) into param1 from myemployees.employees where department_id = param1;
END;

#呼叫儲存過程
set @a = 50;
call p4(@a);
select @a;

5. 刪除儲存過程
語法:  DROP PROCEDURE 儲存過程名;

6.帶有迴圈的儲存過程
#5.帶有迴圈的儲存過程  while 輸出 1-1000之和
create procedure p5(out param1 int,in param2 int)
begin
	#定義區域性變數
	declare sum int default 0;
	declare i int default 0;
	while i <=param2 do
	 set sum = sum + i ;
	 set i = i + 1;
	end while;
	#輸出變數sum
  select sum into param1;
end;


#刪除儲存過程
drop procedure p5;

#呼叫儲存過程
set @a = 0;
call p5(@a,1000);

select @a;
引數說明:
	1. DECLARE:宣告變數
	2. set: 給某個變數賦值
	3. while  .. do  ... end while : while 迴圈的語法

使用儲存過程 實現批量新增資料

create PROCEDURE pp(in number int)
BEGIN
		declare str varchar(3000) default '';
		declare i int default 0;
		declare a varchar(20) default '';
		declare b varchar(20) default '';
		declare c varchar(20) default '';
		declare d varchar(20) default '';
		set str = '先帝創業未半而中道崩殂今天下三分益州疲弊此誠危急存亡之秋也然侍衛之臣不懈於內忠志之士忘身於外者蓋追先帝之殊遇欲報之於陛下也誠宜開張聖聽以光先帝遺德恢弘志士之氣不宜妄自菲薄引喻失義以塞忠諫之路也宮中府中俱為一體陟罰臧否不宜異同若有作奸犯科及為忠善者宜付有司論其刑賞以昭陛下平明之理不宜偏私使內外異法也侍中侍郎郭攸之費禕董允等此皆良實志慮忠純是以先帝簡拔以遺陛下愚以為宮中之事事無大小悉以諮之然後施行必能裨補闕漏有所廣益將軍向寵性行淑均曉暢軍事試用於昔日先帝稱之曰能是以眾議舉寵為督愚以為營中之事悉以諮之必能使行陣和睦優劣得所親賢臣遠小人此先漢所以興隆也親小人遠賢臣此後漢所以傾頹也先帝在時每與臣論此事未嘗不嘆息痛恨於桓靈也侍中尚書長史參軍此悉貞良死節之臣願陛下親之信之則漢室之隆可計日而待也';
		while(i<number) DO
			set a =  SUBSTRING(str,ceil(RAND()*340),1);
			set b =  SUBSTRING(str,ceil(RAND()*340),1);
			set c =  SUBSTRING(str,ceil(RAND()*340),1);
			set d =  SUBSTRING(str,ceil(RAND()*340),1);
			set i = i +1;
			insert into user_test values(null,concat(a,b,c,d),CEIL(rand()*100));
		end while;
END;


call pp(5000000);


create table user_test(
	id int primary key auto_increment,
	name varchar(200),
	age int
)