SQL之存儲過程詳細介紹及語法(篇幅比較長慢慢看)

 

1:定義sql

      存儲過程(stored procedure)是一組爲了完成特定功能的SQL語句集合,經編譯後存儲在服務器端的數據庫中,利用存儲過程能夠加速SQL語句的執行。數據庫

      存儲過程分爲系統存儲過程和自定義存儲過程。安全

        *系統存儲過程在master數據庫中,可是在其餘的數據庫中能夠直接調用,而且在調用時沒必要在存儲過程前加上數據庫名,由於在建立一個新數據庫時,系統存儲過程服務器

         在新的數據庫中會自動建立網絡

         *自定義存儲過程,由用戶建立並能完成某一特定功能的存儲過程,存儲過程既能夠有參數又有返回值,可是它與函數不一樣,存儲過程的返回值只是指明執行是否成功,函數

          並不能像函數那樣被直接調用,只能利用execute來執行存儲過程。
  post

2:存儲過程的優勢 加密

       *提升應用程序的通用性和可移植性:存儲過程建立後,能夠在程序中被屢次調用,而沒必要從新編寫該存儲過程的SQL語句。而且數據庫專業人員能夠隨時對存儲過程進行spa

修改,且對程序源代碼沒有影響,這樣就極大的提升了程序的可移植性。.net

       *能夠更有效的管理用戶操做數據庫的權限:在Sql Server數據庫中,系統管理員能夠經過對執行某一存儲過程的權限進行限制,從而實現對相應的數據訪問進行控制,

避免非受權用戶對數據庫的訪問,保證數據的安全。

        *能夠提升SQL的速度,存儲過程是編譯過的,若是某一個操做包含大量的SQL代碼或分別被執行屢次,那麼使用存儲過程比直接使用單條SQL語句執行速度快的多。

         *減輕服務器的負擔:當用戶的操做是針對數據庫對象的操做時,若是使用單條調用的方式,那麼網絡上還必須傳輸大量的SQL語句,若是使用存儲過程,

 則直接發送過程的調用命令便可,下降了網絡的負擔。

 

3:建立存儲過程

   SQL Server建立存儲過程:

      create procedure  過程名

         @parameter       參數類型

         @parameter      參數類型   

          as 

          begin

    寫須要的語句或者其餘參數等等

          end

 

          執行存儲過程:execute 過程名

 

  Oracle建立存儲過程:

           create procedure     過程名

           parameter  in|out|in out   參數類型

              .......

           parameter  in|out|in out   參數類型

              ........

            as 

            begin

                 命令行或者命令塊

                 exception

                 命令行或者命令塊

              end

4:不帶參數的存儲過程

 

複製代碼
 1 create procedure proc_sql1  
 2 as  
 3 begin  
 4     declare @i int  
 5     set @i=0  
 6     while @i<26  
 7       begin  
 8          print char(ascii('a') + @i) + '的ASCII碼是: ' + cast(ascii('a') + @i as varchar(5))   
 9          set @i = @i + 1  
10       end  
11 end  
複製代碼

 

 

1 exec proc_sql1

 

複製代碼
 1 a的ASCII碼是: 97  
 2 b的ASCII碼是: 98  
 3 c的ASCII碼是: 99  
 4 d的ASCII碼是: 100  
 5 e的ASCII碼是: 101  
 6 f的ASCII碼是: 102  
 7 g的ASCII碼是: 103  
 8 h的ASCII碼是: 104  
 9 i的ASCII碼是: 105  
10 j的ASCII碼是: 106  
11 k的ASCII碼是: 107  
12 l的ASCII碼是: 108  
13 m的ASCII碼是: 109  
14 n的ASCII碼是: 110  
15 o的ASCII碼是: 111  
16 p的ASCII碼是: 112  
17 q的ASCII碼是: 113  
18 r的ASCII碼是: 114  
19 s的ASCII碼是: 115  
20 t的ASCII碼是: 116  
21 u的ASCII碼是: 117  
22 v的ASCII碼是: 118  
23 w的ASCII碼是: 119  
24 x的ASCII碼是: 120  
25 y的ASCII碼是: 121  
26 z的ASCII碼是: 122 
複製代碼

 

5:數據查詢功能的不帶參數的存儲過程

 

1 create procedure proc_sql2  
2 as  
3 begin  
4   select * from 職工 where 工資>2000  
5 end  

 

 

execute proc_sql2  

 


 

 

在存儲過程當中能夠包含多個select語句,顯示姓名中含有」張「字職工信息及其所在的倉庫信息,

複製代碼
1 create procedure pro_sql5  
2 as  
3 begin  
4    select * from 職工 where 姓名 like '%張%'  
5    select * from 倉庫 where 倉庫號 in(select 倉庫號 from 職工 where 姓名 like '%張%')  
6 end  
7   
8 go  
9 execute pro_sql5
複製代碼

 


 

6:帶有輸入參數的存儲過程

     找出三個數字中的最大數:

複製代碼
 1 create proc proc_sql6  
 2 @num1 int,  
 3 @num2 int,  
 4 @num3 int  
 5 as  
 6 begin  
 7    declare @max int  
 8    if @num1>@num2    
 9       set @max = @num1  
10    else set @max = @num2  
11      
12    if @num3 > @max  
13       set @max = @num3  
14         
15    print '3個數中最大的數字是:' + cast(@max as varchar(20))  
16 end  
複製代碼
execute proc_sql6 15, 25, 35 

 


   3個數中最大的數字是:35

 

7:求階乘之和 如6! + 5! + 4! + 3! + 2! + 1

複製代碼
 1 alter proc proc_sql7  
 2    @dataSource int  
 3 as  
 4 begin  
 5    declare @sum int, @temp int, @tempSum int  
 6    set @sum = 0  
 7    set @temp = 1  
 8    set @tempSum = 1  
 9    while @temp <= @dataSource  
10       begin  
11          set @tempSum = @tempSum * @temp  
12          set @sum = @sum + @tempSum  
13          set @temp = @temp + 1  
14      end  
15    print cast(@dataSource as varchar(50)) + '的階乘之和爲:' + cast(@sum as varchar(50))  
16 end  
複製代碼

 

execute proc_sql7 6  

 

 

6的階乘之和爲:873

 

8:帶有輸入參數的數據查詢功能的存儲過程

複製代碼
1 create proc proc_sql8   
2   @mingz int,  
3   @maxgz int  
4 as  
5 begin  
6    select * from 職工 where 工資>@mingz and 工資<@maxgz  
7 end  
複製代碼

 

 

execute proc_sql8 2000,5000

 

 


 

9:帶輸入和輸出參數的存儲過程:顯示指定倉庫號的職工信息和該倉庫號的最大工資和最小工資

複製代碼
 1 create proc proc_sql9  
 2   @cangkuhao varchar(50),  
 3   @maxgz int output,  
 4   @mingz int output  
 5 as  
 6 begin  
 7   select * from 職工 where 倉庫號=@cangkuhao  
 8   select @maxgz=MAX(工資) from 職工 where 倉庫號=@cangkuhao  
 9   select @mingz=MIN(工資) from 職工 where 倉庫號=@cangkuhao  
10 end  
複製代碼

 

 

1 declare @maxgz int, @mingz int  
2 execute proc_sql9 'wh1', @maxgz output, @mingz output  
3 select @maxgz as 職工最大工資, @mingz as 職工最小工資  

 


 

10:帶有登陸判斷功能的存儲過程

        

[sql]  view plain  copy
 
  1. create proc proc_sql10  
  2.  @hyuer varchar(50),  
  3.  @hypwd varchar(50)  
  4. as  
  5. begin  
  6.   if @hyuer = 'hystu1'  
  7.      begin  
  8.          if @hypwd = '1111'  
  9.             print '用戶名和密碼輸入正確'  
  10.          else   
  11.             print '密碼輸入錯誤'  
  12.      end  
  13.   else if @hyuer = 'hystu2'  
  14.      begin  
  15.           if @hypwd = '2222'  
  16.             print '用戶名和密碼輸入正確'  
  17.          else   
  18.             print '密碼輸入錯誤'  
  19.      end  
  20.   else if @hyuer = 'hystu3'  
  21.      begin  
  22.            if @hypwd = '3333'  
  23.             print '用戶名和密碼輸入正確'  
  24.          else   
  25.             print '密碼輸入錯誤'  
  26.      end  
  27.   else   
  28.       print '您輸入的用戶名不正確,請從新輸入'  
  29. end  

 

 

[sql]  view plain  copy
 
  1. execute proc_sql10 'hystu1', '11'  


密碼輸入錯誤

 

11:帶有判斷條件的插入功能的存儲過程

    

[sql]  view plain  copy
 
  1. create proc proc_sq111  
  2.  @zghao varchar(30),  
  3.  @ckhao varchar(30),  
  4.  @sname varchar(50),  
  5.  @sex varchar(10),  
  6.  @gz int  
  7. as  
  8. begin  
  9.   if Exists(select * from 職工 where 職工號=@zghao)  
  10.      print '該職工已經存在,請從新輸入'  
  11.   else   
  12.      begin  
  13.         if Exists(select * from 倉庫 where 倉庫號=@ckhao)  
  14.            begin  
  15.               insert into 職工(職工號, 倉庫號, 姓名, 性別, 工資)   
  16.                            values(@zghao, @ckhao, @sname, @sex, @gz)  
  17.            end  
  18.         else  
  19.            print '您輸入的倉庫號不存在,請從新輸入'  
  20.      end  
  21. end  

   

 

[sql]  view plain  copy
 
  1. execute proc_sq111 'zg42', 'wh1', '張平', '女', 1350  



12: 建立加密存儲過程

   

[sql]  view plain  copy
 
  1. create proc proc_enerypt  
  2. with encryption  
  3. as  
  4. begin  
  5.   select * from 倉庫  
  6. end  

 

所謂加密存儲過程,就是將create proc 語句的原始文本轉換爲模糊格式,模糊代碼的輸出在SQL Server的任何目錄視圖中都能直接顯示

 

13: 查看存儲過程和功能代碼信息

       

[sql]  view plain  copy
 
  1. select name, crdate from sysobjects where type='p'  

 

 

查看指定存儲過程的屬性信息:

 

[sql]  view plain  copy
 
  1. execute sp_help proc_sql1  

 

 

查看存儲過程所使用的數據對象的信息

 

[sql]  view plain  copy
 
  1. execute sp_depends proc_sql2  


 

查看存儲過程的功能代碼

 

[sql]  view plain  copy
 
  1. execute sp_helptext proc_sql9  

 

14:重命名存儲過程名

    execute sp_rename 原存儲過程名, 新存儲過程名

 

15:刪除存儲過程

    drop 過程名

 

 帶有判斷條件的刪除存儲過程

     

[sql]  view plain  copy
 
  1. if Exists(select * from dbo.sysobjects where name='proc_sql6' and xtype='p')  
  2.    begin  
  3.       print '要刪除的存儲過程存在'  
  4.         drop proc proc_sq16  
  5.       print '成功刪除存儲過程proc_sql6'  
  6.    end  
  7. else  
  8.     print '要刪除的存儲過程不存在'  



16:存儲過程的自動執行

      使用sp_procoption系統存儲過程便可自動執行一個或者多個存儲過程,其語法格式以下:

      sp_procoption [@procName=] 'procedure', [@optionName=] 'option', [@optionValue=] 'value'

      各個參數含義以下:

         [@procName=] 'procedure': 即自動執行的存儲過程

         [@optionName=] 'option':其值是startup,即自動執行存儲過程

         [@optionValue=] 'value':表示自動執行是開(true)或是關(false)

 

[sql]  view plain  copy
 
  1. sp_procoption @procName='masterproc', @optionName='startup', @optionValue='true'  


     利用sp_procoption系統函數設置存儲過程masterproc爲自動執行

 

17:監控存儲過程

      可使用sp_monitor能夠查看SQL Server服務器的各項運行參數,其語法格式以下:

     sp_monitor

     該存儲過程的返回值是布爾值,若是是0,表示成功,若是是1,表示失敗。該存儲過程的返回集的各項參數的含義以下:

      *last_run: 上次運行時間

      *current_run:本次運行的時間

      *seconds: 自動執行存儲過程後所通過的時間

      *cpu_busy:計算機CPU處理該存儲過程所使用的時間

      *io_busy:在輸入和輸出操做上花費的時間

       *idle:SQL Server已經空閒的時間

       *packets_received:SQL Server讀取的輸入數據包數

       *packets_sent:SQL Server寫入的輸出數據包數

        *packets_error:SQL Server在寫入和讀取數據包時遇到的錯誤數

        *total_read: SQL Server讀取的次數

         *total_write: SQLServer寫入的次數

         *total_errors: SQL Server在寫入和讀取時遇到的錯誤數

          *connections:登陸或嘗試登陸SQL Server的次數

 

相關文章
相關標籤/搜索