sql存儲過程在什麼時候被編譯
sql/plus是個oracle自帶的工具,存儲過程是sql語句,完全不相同的兩個東西,存儲過程簡單來說就類似於一個集合,裡面封裝了一些你需要的sql,在使用的時候直接調用就好了
Ⅱ Sql 存儲過程
sql語句執行的時候要先編譯,然後執行。存儲過程(Stored
Procere)是一組為了完成特定功能的SQL語句集,經編譯後存儲在資料庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。
Ⅲ SQL中存儲過程是干什麼用的
存儲過程是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,它存儲在資料庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象。
資料庫存儲過程的實質就是部署在資料庫端的一組定義代碼以及SQL。將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來,那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
每個參數名前要有一個「@」符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。
(3)sql存儲過程在什麼時候被編譯擴展閱讀:
SQL中存儲過程優點:
1、重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
2、減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
3、安全性。參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。
4、存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
Ⅳ SQL語句問題:存儲過程定義是什麼什麼時候用它作用是什麼怎樣寫,來個實例!
定義:存儲過程是一組為了完成特定功能的SQL語句集,是利用SQL Server所提供的Transact-SQL語言所編寫的程序。作用:將常用或復雜的工作,預先用SQL語句寫好並用一個指定名稱存儲起來, 以後需要資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。什麼時候用:提高資料庫執行速度,對資料庫進行復雜操作,重復使用,安全要求高例子: CREATE PROCEDURE order_tot_amt @o_id int, @p_tot int output AS SELECT @p_tot = sum(Unitprice*Quantity) FROM orderdetails WHERE ordered=@o_id GO
Ⅳ sql 中的存儲過程誰能描述下下··謝謝
標准答案:
在最新的SQL2005中的存儲過程(Procere)類似於java語言中的方法,它是SQL語句和控制流語句的預編譯集合。存儲過程在資料庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變數,邏輯控制語句以及其他強大的編程功能。
存儲過程可包含邏輯控制語句和數據操作語句,它可以接收參數,輸出參數,返回單個或多個結果集以及返回值。
給你一個例子:
create proc proc_takeMoney
@cardID1 varchar(20), --匯款賬號
@pwd int , --匯款密碼
@takeMoney money, --匯款金額
@cardID2 varchar(20) --存款賬號
as
set nocount on
declare @err int
set @err = 0
if exists(select 1 from cardInfo where cardID = @cardID1 and pass = @pwd)
begin
begin tran --事物開始
update cardInfo set balance = balance + @takeMoney where cardID = @cardID2 --接受款帳戶加上@takeMoney
set @err = @err + @@error
update cardInfo set balance = balance - @takeMoney where cardID = @cardID1 --匯款帳戶減去@takeMoney
set @err = @err + @@error
/*--交易信息表插入交易信息--*/
insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID1,'支取',@takeMoney)
set @err = @err + @@error
insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID2,'存入',@takeMoney)
set @err = @err + @@error
/*--交易信息--*/
select top 2 * from transInfo order by transDate desc
if(@err<>0)
begin
rollback tran --錯誤回滾事物
end
else
begin
commit tran --無錯誤提交事物
end
end --if結束
else
begin
print '密碼錯誤'
end
/*--調用存儲過程--*/
declare @cardID1 varchar(20),@cardID2 varchar(20),@pwd int ,@takeMoney money
set @cardID1 ='1010 3576 1234 5678' --張三卡號
set @pwd = 888888 --張三密碼
set @cardID2 ='1010 3576 1212 1134' --李四卡號
set @takeMoney =20 --匯款金額
exec proc_takeMoney @cardID1 ,@pwd,@takeMoney,@cardID2
Ⅵ SQL存儲過程如何學習
每一種資料庫系統的存儲過程、觸發器的寫法都會有不同,包括變數的定義格式等,都可能有差異。我沒有用過oracle,只懂informix、SQLServer。最好的辦法是找本書,或者看聯機幫助(不知道oracle有沒有像SQLServer那麼方便的聯機幫助),邊學邊練。只有自己多動手,才能真正掌握。
Ⅶ sql存儲過程是什麼
所有設計優良的 Microsoft® SQL Server™ 2000 應用程序都應當使用存儲過程。不論是否將應用程序的業務邏輯寫入存儲過程都應如此。甚至連沒有業務邏輯組件的標准 Transact-SQL 語句,在用參數打包成存儲過程後也能獲得性能收益。編譯進存儲過程的 Transact-SQL 語句在執行時可省去大量的處理。
存儲過程的另一個優點是客戶端執行請求使用網路的效率比將等效的 Transact-SQL 語句發送到伺服器高。例如,假設應用程序需要將一個大的二進制值插入 image 數據列。為使用 INSERT 語句發送數據,該應用程序必須將該二進制值轉換為字元串(其大小翻倍),然後發送到伺服器。伺服器再將該值轉換回二進制格式以存儲在 image 列中。
相反,應用程序可以創建下列格式的存儲過程:
CREATE PROCEDURE P(@p1 image) AS INSERT T VALUES (@p1)
當客戶端應用程序請求執行過程 P 時,image 參數值將一直以二進制格式發送到伺服器,從而節省處理時間並減少網路流量。
如果 SQL Server 存儲過程中包含業務服務邏輯,因為業務服務邏輯將處理移動到數據,而不是將數據移動到處理,因而存儲過程能提供更大的性能收益。
存儲過程的優點
(1)存儲過程的能力大大增強了SQL語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。
(2) 可保證數據的安全性和完整性。
● 通過存儲過程可以使沒有許可權的用戶在控制之下間接地存取資料庫,從而保證數據的安全。
● 通過存儲過程可以使相關的動作在一起發生,從而可以維護資料庫的完整性。
(3) 再運行存儲過程前,資料庫已對其進行了語法和句法分析,並給出了優化執行方案。這種已經編譯好的過程可極大地改善SQL語句的性能。 由於執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執行。
(4)可以降低網路的通信量。
(5) 使體現企業規則的運算程序放入資料庫伺服器中,以便:
● 集中控制。
● 當企業規則發生變化時在伺服器中改變存儲過程即可,無須修改任何應用程序。企業規則的特點是要經常變化,如果把體現企業規則的運算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序工作量非常之大(修改、發行和安裝應用程序)。如果把體現企業規則的 運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可以了,應用程序無須任何變化。
1.使用企業管理器創建用戶存儲過程
操作步驟如下:
(1)啟動SQL Server企業管理器。
(2)在「控制台根目錄」窗口,展開「SQL Server組」,首先,選擇「資料庫」,然後,選擇「存儲過程」,單擊滑鼠右鍵,打開快捷菜單。
(3)在打開快捷菜單中,選擇「新建存儲過程」菜單命令,進入「存儲過程屬性」窗口。
(4)在「存儲過程屬性」窗口,在文本框中輸入存儲過程代碼,單擊「確定」,結束存儲過程的創建。
2.使用T-SQL語句創建用戶存儲過程
SQL命令格式:
CREATE PROC [ EDURE ] <Procere_name> [ ; Number ]
[ { @parameter Data_type }
[ VARYING ] [ = Default ] [ OUTPUT ]] [ ,...n ]
[ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION }]
[ FOR REPLICATION ]
AS sql_statements
功能:創建一個用戶存儲過程,並保存在資料庫中。
Ⅷ SQL 中存儲過程怎麼使用
一、簡單的儲存過程:
1、創建一個存儲過程
create procere GetUsers()
begin
select * from user;
end;12345
2、調用存儲過程
call GetUsers();12
3、刪除存儲過程
drop procere if exists GetUsers;
二、帶參數的存儲過程
1、MySql 支持 IN (傳遞給存儲過程) , OUT (從存儲過程傳出) 和 INOUT (對存儲過程傳入和傳出) 類型的參數 , 存儲過程的代碼位於 BEGIN 和 END 語句內 , 它們是一系列 SQL 語句 , 用來檢索值 , 然後保存到相應的變數 (通過指定INTO關鍵字) ;
2、下面的存儲過程接受三個參數 , 分別用於獲取用戶表的最小 , 平均 , 最大分數 , 每個參數必須具有指定的類型 , 這里使用十進制值(decimal(8,2)) , 關鍵字 OUT 指出相應的參數用來從存儲過程傳出
create procere GetScores(
out minScore decimal(8,2),
out avgScore decimal(8,2),
out maxScore decimal(8,2)
)
begin
select min(score) into minScore from user;
select avg(score) into avgScore from user;
select max(score) into maxScore from user;
end;1234567891011
3、調用此存儲過程 , 必須指定3個變數名(所有 MySql 變數都必須以@開始) , 如下所示 :
call GetScores(@minScore, @avgScore, @maxScore);12
4、該調用並沒有任何輸出 , 只是把調用的結果賦給了調用時傳入的變數@minScore, @avgScore, @maxScore, 然後即可調用顯示該變數的值 :
select @minScore, @avgScore, @maxScore;
5、使用 IN 參數 , 輸入一個用戶 id , 返回該用戶的名字 :
create procere GetNameByID(
in userID int,
out userName varchar(200)
)
begin
select name from user
where id = userID
into userName;
end;12345678910
6、調用存儲過程 :
call GetNameByID(1, @userName);
select @userName;123
Ⅸ SQL 存儲過程建立和使用方法
Sql Server的存儲過程是一個被命名的存儲在伺服器上的Transacation-Sql語句集合,是封裝重復性工作的一種方法,它支持用戶聲明的變數、條件執行和其他強大的編程功能。 存儲過程相對於其他的資料庫訪問方法有以下的優點: (1)重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。 (2)提高性能。存儲過程在創建的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執行一次就需要編譯一次,所以使用存儲過程提高了效率。 (3)減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。 (4)安全性。參數化的存儲過程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。 存儲過程一共分為了三類:用戶定義的存儲過程、擴展存儲過程以及系統存儲過程。 其中,用戶定義的存儲過程又分為Transaction-SQL和CLR兩種類型。 Transaction-SQL 存儲過程是指保存的Transaction-SQL語句集合,可以接受和返回用戶提供的參數。 CLR存儲過程是指對.Net Framework公共語言運行時(CLR)方法的引用,可以接受和返回用戶提供的參數。他們在.Net Framework程序集中是作為類的公共靜態方法實現的。(本文就不作介紹了) 創建存儲過程的語句如下:Code
CREATE { PROC | PROCEDURE } [schema_name.] procere_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH <procere_option> [ ,n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procere_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name [schema_name]: 代表的是存儲過程所屬的架構的名稱 例如: Create Schema yangyang8848
Go
Create Proc yangyang8848.AllGoods
As Select * From Master_Goods
Go 執行:Exec AllGoods 發生錯誤。 執行:Exec yangyang8848.AllGoods 正確執行。 [;Number]: 用於對同名過程進行分組的可選整數。使用一個 DROP PROCEDURE 語句可將這些分組過程一起刪除。 例如: Create Proc S1 ;1
AS
Select * From Master_Goods
Go
Create Proc S1 ;2
As
Select * From Master_Location
Go 創建完畢了兩個存儲過程。它們在同一個組S1里,如果執行Exec S1 則存儲過程默認執行 Exec S1 ;1 。如果我們想得到所有據點信息則需要執行Exec S1 ;2。當我們要刪除存儲過程的時候,只能執行Drop Exec S1 則該組內所有的存儲過程被刪除。 [@ parameter]: 存儲過程中的參數,除非將參數定義的時候有默認值或者將參數設置為等於另一個參數,否則用戶必須在調用存儲過程的時候為參數賦值。 存儲過程最多有2100個參數。 例如: Create Proc yangyang8848.OneGoods
@GoodsCode varchar(10)
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Go 調用的代碼: Declare @Code varchar(10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code 在參數的後邊加入Output 表明該參數為輸出參數。 Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 調用方法:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out 注意:如果存儲過程的兩個參數一個有默認值一個沒有,那麼我們要把有默認值得放在後邊,不然會出問題哦~~ 細心的朋友,可能看到上邊的語句有一些不同,比如,存儲過程用的是output,而調用語句用的是out。我要告訴您,兩者是一樣的。 [RECOMPILE]:指示資料庫引擎 不緩存該過程的計劃,該過程在運行時編譯。如果指定了 FOR REPLICATION,則不能使用此選項。對於 CLR 存儲過程,不能指定 RECOMPILE。 這個說一個非常好用的函數 OBJECT_ID :返回架構范圍內對象的資料庫對象標識號。 例如:我們創建存儲過程時,可以如下寫代碼 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 針對於上邊的這個存儲過程,我們調用以下SQL查詢 Select definition From sys.sql_moles
Where object_id = Object_ID('yangyang8848.OneGoods'); 我們是可以查到結果的。 可是如果我們對該存儲過程加入[ ENCRYPTION ] 那麼你將無法看到任何結果 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011' With Encryption
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go</SPAN> 然後我們查詢 sys.sql_moles 目錄視圖,將返回給你Null。</p> 然後我們執行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods' 你將得到以下結果:The text for object 'yangyang8848.OneGoods' is encrypted. 說到這里你應該明白了,參數[ ENCRYPTION ]:是一種加密的功能, 將 CREATE PROCEDURE 語句的原始文本轉換為模糊格式。模糊代碼的輸出在 SQL Server 2005 的任何目錄視圖中都不能直接顯示。對系統表或資料庫文件沒有訪問許可權的用戶不能檢索模糊文本。但是,可通過 DAC 埠訪問系統表的特權用戶或直接訪問資料庫文件的特權用戶可使用此文本。此外,能夠向伺服器進程附加調試器的用戶可在運行時從內存中檢索已解密的過程。 前兩天寫了一篇關於游標的介紹文章 ,下邊寫一個例子,將游標與存儲過程一起使用上: If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go Create Proc GetMasterGoods
@MyCursor Cursor Varying Output
With Encryption
As
Set @MyCursor = Cursor
For
Select GoodsCode,GoodsName From Master_Goods
Open @MyCursor
Go --下邊建立另外一個存儲過程,用於遍歷游標輸出結果 Create Proc GetAllGoodsIDAndName
As Declare @GoodsCode varchar(18)
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor
Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go 最後執行Exec GetAllGoodsIDAndName結果為以下內容 0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014
Ⅹ SQLSERVER 什麼時候重新編譯執行計劃
根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計劃效率降低或無效。SQL Server 將檢測到使執行計劃無效的更改,並將計劃標記為無效。此後,必須為執行查詢的下一個連接重新編譯新的計劃。導致計劃無效的情況包括:
對查詢所引用的表或視圖進行更改(ALTER TABLE 和 ALTER VIEW)。
對執行計劃所使用的任何索引進行更改。
對執行計劃所使用的統計信息進行更新,這些更新可能是從語句(如 UPDATE STATISTICS)中顯式生成,也可能是自動生成的。
刪除執行計劃所使用的索引。
顯式調用 sp_recompile。
對鍵的大量更改(其他用戶對由查詢引用的表使用 INSERT 或 DELETE 語句所產生的修改)。
對於帶觸發器的表,插入的或刪除的表內的行數顯著增長。
使用 WITH RECOMPILE 選項執行存儲過程。
為了使語句正確,或要獲得可能更快的查詢執行計劃,大多數都需要進行重新編譯。
在 SQL Server 2000 中,只要批處理中的語句導致重新編譯,就會重新編譯整個批處理,無論此批處理是通過存儲過程、觸發器、即席批查詢,還是通過預定義的語句進行提交。在 SQL Server 2005 和更高版本中,只會重新編譯批處理中導致重新編譯的語句。由於這種差異,SQL Server 2000 和更高版本中的重新編譯計數不可比較。另外,由於 SQL Server 2005 和更高版本擴展了功能集,因此它們具有更多類型的重新編譯。
語句級重新編譯有助於提高性能,因為在大多數情況下,只有少數語句導致了重新編譯並造成相關損失(指 CPU 時間和鎖)。因此,避免了批處理中其他不必重新編譯的語句的這些損失。
SQL Server ProfilerSP:Recompile 跟蹤事件報告語句級重新編譯。此跟蹤事件在 SQL Server 2000 中僅報告批處理重新編譯。此外,將填充此事件的 TextData 列。因此,已不再需要 SQL Server 2000 中必須跟蹤 SP:StmtStarting 或 SP:StmtCompleted 以獲取導致重新編譯的 Transact-SQL 文本的做法。
跟蹤事件 SQL:StmtRecompile 報告語句級重新編譯。此跟蹤事件可用於跟蹤和調試重新編譯。SP:Recompile 僅針對存儲過程和觸發器生成,而SQL:StmtRecompile 則針對存儲過程、觸發器、即席批查詢、使用 sp_executesql 執行的批處理、已准備的查詢和動態 SQL 生成。
SP:Recompile 和 SQL:StmtRecompile 的 EventSubClass 列都包含一個整數代碼,用以指明重新編譯的原因。