簡介
存儲過程(Stored Procedure)是在大型數據庫系統中,一組爲了完成特定功能的SQL 語句集,它存儲在數據庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
優點
1.存儲過程的能力大大增強了SQL語言的功能和靈活性。
2.可保證數據的安全性和完整性。
-
通過存儲過程可以使沒有權限的用戶在控制之下間接地存取數據庫,從而保證數據的安全。
-
通過存儲過程可以使相關的動作在一起發生,從而可以維護數據庫的完整性。
3.創建時已經檢查了語法;第一次執行的時候執行計劃被創建,被編譯,再次執行時不需要重檢查語法、不需要重編譯、根據已經緩存的計劃來決定是否需要重創建執行計劃
4.減少網絡流量。存儲過程位於服務器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網絡傳輸的數據量。
5.重複使用。存儲過程可以重複使用,從而可以減少數據庫開發人員的工作量。
存儲過程種類
存儲過程可以分爲系統存儲過程、擴展存儲過程和用戶自定義的存儲過程
系統存儲過程
我們先來看一下系統存儲過程,系統存儲過程由系統定義,主要存放在MASTER數據庫中,名稱以"SP"開頭或以"XP"開頭。儘管這些系統存儲過程在MASTER數據庫中,
但我們在其他數據庫還是可以調用系統存儲過程。有一些系統存儲過程會在創建新的數據庫的時候被自動創建在當前數據庫中。
常用系統存儲過程有:
exec sp_databases; --查看數據庫
exec sp_tables; --查看錶
exec sp_columns student;--查看列
exec sp_helpIndex student;--查看索引
exec sp_helpConstraint student;--約束
exec sp_helptext 'sp_stored_procedures';--查看存儲過程創建定義的語句
exec sp_stored_procedures;
exec sp_rename student, stuInfo;--更改表名
exec sp_renamedb myTempDB, myDB;--更改數據庫名稱
exec sp_defaultdb 'master', 'myDB';--更改登錄名的默認數據庫
exec sp_helpdb;--數據庫幫助,查詢數據庫信息
exec sp_helpdb master;
exec sp_attach_db --附加數據庫
exec sp_detach_db --分離數據庫
存儲過程語法
CREATE PROC[EDURE] 存儲過程名
@參數1 [數據類型]=[默認值] [OUTPUT]
@參數2 [數據類型]=[默認值] [OUTPUT]
AS
SQL語句
EXEC 過程名[參數]
存儲過程案例
1.不帶參數
create procedure proc_select_officeinfo--(存儲過程名)
as select Id,Name from Office_Info--(sql語句)
exec proc_select_officeinfo--(調用存儲過程)
2.帶輸入參數
create procedure procedure_proc_GetoffinfoById --(存儲過程名)
@Id int--(參數名 參數類型)
as select Name from dbo.Office_Info where Id=@Id--(sql語句)
exec procedure_proc_GetoffinfoById 2--(存儲過程名稱之後,空格加上參數,多個參數中間以逗號分隔)
注:參數賦值是,第一個參數可以不寫參數名稱,後面傳入參數,需要明確傳入的是哪個參數名稱
3.帶輸入輸出參數
create procedure proc_office_info--(存儲過程名)
@Id int,@Name varchar(20) output--(參數名 參數類型)傳出參數要加上output
as
begin
select @Name=Name from dbo.Office_Info where Id=@Id --(sql語句)
end
declare @houseName varchar(20) --聲明一個變量,獲取存儲過程傳出來的值
exec proc_office_info--(存儲過程名)
4,@houseName output--(傳說參數要加output 這邊如果用@變量 = OUTPUT會報錯,所以換一種寫法)
select @houseName--(顯示值)
4.帶返回值的
create procedure proc_office_info--(存儲過程名)
@Id int--(參數名 參數類型)
as
begin
if(select Name from dbo.Office_Info where Id=@Id)=null --(sql語句)
begin
return -1
end
else
begin
return 1
end
end
declare @house varchar(20) --聲明一個變量,獲取存儲過程傳出來的值
exec @house=proc_office_info 2 --(調用存儲過程,用變量接收返回值)
--注:帶返回值的存儲過程只能爲int類型的返回值
print @house
參考資料:
《Oracle9i數據庫基礎》
淺談數據庫之存儲過程 https://www.cnblogs.com/ToNi/p/4234370.html