存儲過程
6.1. 創建無參數存儲過程
6.1. 創建無參數存儲過程
- IF EXISTS (SELECT name FROM sysobjects
- WHERE name = 'au_info_all' AND type = 'P')
- DROP PROCEDURE au_info_all –判斷如果存在XXX過程就刪除
- CREATE PROCEDURE au_info_all –創建存儲過程
- AS
- SELECT pub_name FROM authors
SQLSERVER 調用方法:
- EXECUTE au_info_all/ EXEC au_info_all
ORACLE 調用方法:
6.2. 創建有參數存儲過程
6.2. 創建有參數存儲過程
- IF EXISTS (SELECT name FROM sysobjects
- WHERE name = 'au_info' AND type = 'P')
- DROP PROCEDURE au_info
- CREATE PROCEDURE au_info
- @lastname varchar(40),
- @firstname varchar(20)
- AS
- SELECT au_lname, au_fname, title, pub_name
- FROM authors
- WHERE au_fname = @firstname
- AND au_lname = @lastname
SQLSERVER 調用方法:
- EXECUTE au_info 'Dull', 'Ann'
- EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
6.3. 創建有通配符參數存儲過程
從四個表的聯接中只返回指定的作者(提供了姓名)、出版的書籍以及出版社。該存儲過程對傳遞的參數進行模式匹配,如果沒有提供參數,則使用預設的默認值.
- IF EXISTS (SELECT name FROM sysobjects
- WHERE name = 'au_info2' AND type = 'P')
- DROP PROCEDURE au_info2
- CREATE PROCEDURE au_info2
- @lastname varchar(30) = 'D%',
- @firstname varchar(18) = '%'
- AS
- SELECT au_lname, au_fname, title, pub_name
- FROM authors
- WHERE au_fname LIKE @firstname
- AND au_lname LIKE @lastname
SQLSERVER 調用方法:
- EXECUTE au_info2
- EXECUTE au_info2 'Wh%'
- EXECUTE au_info2 @firstname = 'A%'
- EXECUTE au_info2 'Hunter', 'Sheryl'
- EXECUTE au_info2 'H%', 'S%'
6.4. 創建有Output參數存儲過程
- IF EXISTS(SELECT name FROM sysobjects
- WHERE name = 'titles_sum' AND type = 'P')
- DROP PROCEDURE titles_sum
- CREATE PROCEDURE
- titles_sum
- @@TITLE varchar(40) = '%',
- @@SUM money OUTPUT
- AS
- SELECT 'Title Name' = title
- FROM titles
- WHERE title LIKE @@TITLE
- SELECT @@SUM = SUM(price)
- FROM titles WHERE title LIKE @@TITLE
SQLSERVER 調用方法:
- DECLARE @@TOTALCOST money
- EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
- IF @@TOTALCOST < 200
- BEGIN
- PRINT 'All of these titles can be purchased for less than $200.'
- END
- ELSE
- SELECT 'The total cost of these titles is $' + RTRIM(CAST(@@TOTALCOST AS varchar(20)))
6.5. 創建有Output遊標參數存儲過程
- IF EXISTS (SELECT name FROM sysobjects
- WHERE name = 'titles_cursor' and type = 'P')
- DROP PROCEDURE titles_cursor
- CREATE PROCEDURE titles_cursor @titles_cursor CURSOR VARYING OUTPUT
- AS
- SET @titles_cursor = CURSOR
- FORWARD_ONLY STATIC FOR
- SELECT *
- FROM titles
- OPEN @titles_cursor
SQLSERVER 調用方法:
- DECLARE @MyCursor CURSOR
- EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
- WHILE (@@FETCH_STATUS = 0)
- BEGIN
- FETCH NEXT FROM @MyCursor
- END
- CLOSE @MyCursor
- DEALLOCATE @MyCursor
6.6. 創建有WITH RECOMPILE存儲過程
當每次調用存儲過程時都重新編譯存儲過程,目前尚未發現這個參數的用處
- CREATE PROCEDURE titles_by_author
- @@LNAME_PATTERN varchar(30) = '%'
- WITH RECOMPILE
- AS
- SELECT RTRIM(au_fname) + ' ' + RTRIM(au_lname) AS 'Authors full name',
- title AS Title
- FROM authors a INNER JOIN titleauthor ta
- ON a.au_id = ta.au_id INNER JOIN titles t
- ON ta.title_id = t.title_id
- WHERE au_lname LIKE @@LNAME_PATTERN
6.7. 創建有WITH ENCRYPTION存儲過程
對存儲過程進行加密,用於隱藏存儲過程的文本,有編程私心的很重要噢!
- CREATE PROCEDURE encrypt_this
- WITH ENCRYPTION
- AS SELECT * FROM authors
6.8. 調用用戶定義的系統存儲過程
6.9. 刪除存儲過程
- DROP PROCEDURE procecureName
6.10. 在SQL中存儲過程的調用
? 無參數存儲過程調用
- EXECUTE au_info_all
? 有參數存儲過程調用
- EXECUTE au_info 'Dull', 'Ann'
- EXECUTE au_info @lastname = 'Dull', @firstname = 'Ann'
? 通配符存儲過程調用
- EXECUTE au_info2
- EXECUTE au_info2 'Wh%'
- EXECUTE au_info2 @firstname = 'A%'
- EXECUTE au_info2 'Hunter', 'Sheryl'
- EXECUTE au_info2 'H%', 'S%'
? Output參數存儲過程調用
- DECLARE @@TOTALCOST money
- EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
- IF @@TOTALCOST < 200
- BEGIN
- PRINT ' '
- END
- ELSE
- SELECT 'The total cost of these titles is $' + RTRIM(CAST(@@TOTALCOST AS varchar(20)))
? Output遊標參數存儲過程調用
- DECLARE @MyCursor CURSOR
- EXEC titles_cursor @titles_cursor = @MyCursor OUTPUT
- WHILE (@@FETCH_STATUS = 0)
- BEGIN
- FETCH NEXT FROM @MyCursor
- END
- CLOSE @MyCursor
- DEALLOCATE @MyCursor