sql存儲過程是什么
sql存儲過程說簡單點就是一個在t-sql下用戶可以自行定義的函數,
但是與一般的函數也有不同的地方,比如它的返回值只能RETURN(INT類型),如果你要輸出什么信息的話只能用OUTPUT.這也是存儲過程的一個特色吧,設定的參數可以有輸出。講起來有點抽象,給你個例子看看吧!
首先創建一個存儲過程
CREATE PROCEDURE cunchuguocheng
@a int,
@b int,
@c int output
as
begin
select @c = @a+@b
return(0)
end
然后調用這個存儲過程
declare @value int, --返回值
@c int --結果值
exec @value = cunchuguocheng 2,2,@c output
select @value as 返回值
select @c as 結果值
程序寫的很簡單,你運行一下我想你就會對存儲過程有所了解了。
存儲過程與SQL語句是怎樣的
我的一位朋友說:他從臺灣知名技術作家李維先生的一本書中獲悉,如果用存儲過程封裝SQL語句,系統效率將有極大提升。
他做過實驗!!! --我相信朋友做過實驗,盡管非親眼所見。不過我估計他的實驗有問題,那樣的實驗不但蒙蔽了他,也蒙蔽了李維先生(如果他的著作中的內容沒有被誤會),甚至更多的人。
然而我必須拿出證據,方能使人信服。 后來遇到一個具體的問題:客戶端經常要向數據庫插入記錄。
在J2EE中,一個 Entity Bean Home 的 create 方法調用中,一般就沒用存儲過程。朋友立馬在觀點上持反對意見( 可能是因為他暫時有來得及否決J2EE ),認為要是J2EE能夠將“插入記錄”諸如此類動作改為對存儲過程的調用就好了。
我們因此再次發生爭論(我僅是反對朋友的看法,但也沒提出任何我自己的看法,因為要下一個結論是很不容易的)。最后我不得已而做了實驗,分別在 Oracle 10g 和 postgreSQL 8。
0。1 上。
實驗內容如下: A、建表腳本: create table ztest( fieldA integer primary key, fieldB varchar(128), fieldC varchar(128) ) B、客戶端請求 DBMS 執行的 insert SQL語句: insert into ztest values( ?1, ?2, ?3 ); -- ?1,?2,?3 將在運行時以合理的值替代之 C、客戶端調用的存儲過程(JDBC CallableStatement 調用): Oracle:(調用方式 call up_add(。 。
。),) create or replace procedure up_add( fieldA integer, fieldB varchar, fieldC varchar ) is begin insert into ztest values( fieldA, fieldB, fieldC); end; postgreSQL:(客戶端調用方式 select uf_add(。
。
) ) CREATE OR REPLACE FUNCTION uf_add (integer, varchar, varchar) RETURNS void AS' begin insert into ztest values($1,$2,$3); return; end; 'LANGUAGE 'plpgsql' VOLATILE RETURNS NULL ON NULL INPUT SECURITY INVOKER; D、環境: postgreSQL:數據庫服務器與客戶端程序“都在本機”并“同時運行” Oracle: 獨立數據庫服務器(測試時始終有人在慢慢打字,應該對機器性能無影響) 測試: 通過不同方式( 即 請求DBMS執行SQL語句 和 調用DBMS邏輯等價的存儲過程)向測試表中連續加入 1024 記錄 經多次反復測試,得結果如下 postgreSQL: 兩種方式下,測試時間均為 21- 24 seconds 之間 (每個結果的測試環境一致) Oracle: 8次 SQL 執行請求分別用時(ms) 5422 4750 3875 3812 5672 3531 3484 3547 6次 存儲過程調用分別用時(ms) 4578 4500 6297 4219 4547 5734 (每個結果的測試環境一致)由此可知,存儲過程封裝簡單的 SQL 語句,效率相當,且可能更低。 但很多朋友的確得出結論:存儲過程的確比SQL快。
為什么?---- 因為他們測試時寫了一個不具實際意義,同時也與SQL語句的“一次客戶端調用”不具可比性的測試用存儲過程。Oracle PL/SQL 描述方式如下,該方法一次調用就可以向數據表添加 1024 條記錄,連網絡通訊都省了。
怪不得性能有“千倍差異”! create or replace procedure up_add( ) is declare n:integer; begin n := 0; while( n 它與客戶端一次提交單條 SQL 語句沒有可比性:當一次只需要向DBMS提交一條新記錄,要這個存儲過程干什么呢?。
SQL中存儲過程是干什么用的
存儲過程是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,它存儲在數據庫中,一次編譯后永久有效,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象。
數據庫存儲過程的實質就是部署在數據庫端的一組定義代碼以及SQL。將常用的或很復雜的工作,預先用SQL語句寫好并用一個指定的名稱存儲起來,那么以后要叫數據庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
每個參數名前要有一個“@”符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。
擴展資料:
SQL中存儲過程優點:
1、重復使用。存儲過程可以重復使用,從而可以減少數據庫開發人員的工作量。
2、減少網絡流量。存儲過程位于服務器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網絡傳輸的數據量。
3、安全性。參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke權限應用于存儲過程。
4、存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
參考資料來源:百度百科-存儲過程
使用SQL語句創建存儲過程
使用SQL語句創建存儲的具體過程如下:
1、首先,打開企業管理器,選擇【工具】-【查詢分析器】:
2、然后,輸入SQL語句。如下:
CREATE PROCEDURE byroyalty1 @percentage int
AS
select au_id from titleauthor
where *yper = @percentage
GO
3、然后,點擊確定之后,命令就會自動添加進查詢中:
4、然后執行一下剛輸入的命令:
5、最后,就可以在彈出的小窗口中查看存儲過程了:
SQl中存儲過程有什么作用
Microsoft SQL Server 中的存儲過程與其他編程語言中的過程類似,原因是存儲過程可以:
* 接受輸入參數并以輸出參數的格式向調用過程或批處理返回多個值。
* 包含用于在數據庫中執行操作(包括調用其他過程)的編程語句。
* 向調用過程或批處理返回狀態值,以指明成功或失敗(以及失敗的原因)。
可以使用 Transact-SQL EXECUTE 語句來運行存儲過程。存儲過程與函數不同,因為存儲過程不返回取代其名稱的值,也不能直接在表達式中使用。
在 SQL Server 中使用存儲過程而不使用存儲在客戶端計算機本地的 Transact-SQL 程序的好處包括:
* 存儲過程已在服務器注冊。
* 存儲過程具有安全特性(例如權限)和所有權鏈接,以及可以附加到它們的證書。
用戶可以被授予權限來執行存儲過程而不必直接對存儲過程中引用的對象具有權限。
* 存儲過程可以強制應用程序的安全性。
參數化存儲過程有助于保護應用程序不受 SQL Injection 攻擊。有關詳細信息,請參閱 SQL Injection。
* 存儲過程允許模塊化程序設計。
存儲過程一旦創建,以后即可在程序中調用任意多次。這可以改進應用程序的可維護性,并允許應用程序統一訪問數據庫。
* 存儲過程是命名代碼,允許延遲綁定。
這提供了一個用于簡單代碼演變的間接級別。
* 存儲過程可以減少網絡通信流量。
一個需要數百行 Transact-SQL 代碼的操作可以通過一條執行過程代碼的語句來執行,而不需要在網絡中發送數百行代碼。
參照聯機
SQL 中存儲過程怎么使用
一、簡單的儲存過程:
1、創建一個存儲過程
create procedure GetUsers()
begin
select * from user;
end;12345
2、調用存儲過程
call GetUsers();12
3、刪除存儲過程
drop procedure if exists GetUsers;
二、帶參數的存儲過程
1、MySql 支持 IN (傳遞給存儲過程) , OUT (從存儲過程傳出) 和 INOUT (對存儲過程傳入和傳出) 類型的參數 , 存儲過程的代碼位于 BEGIN 和 END 語句內 , 它們是一系列 SQL 語句 , 用來檢索值 , 然后保存到相應的變量 (通過指定INTO關鍵字) ;
2、下面的存儲過程接受三個參數 , 分別用于獲取用戶表的最小 , 平均 , 最大分數 , 每個參數必須具有指定的類型 , 這里使用十進制值(decimal(8,2)) , 關鍵字 OUT 指出相應的參數用來從存儲過程傳出
create procedure 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 procedure 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存儲過程使用介紹.csdn博客[引用時間2017-12-31]
sql存儲過程有啥用
Transact-SQL中的存儲過程,非常類似于Java語言中的方法,它可以重復調用。當存儲過程執行一次后,可以將語句緩存中,這樣下次執行的時候直接使用緩存中的語句。這樣就可以提高存儲過程的性能。
? 存儲過程的概念
存儲過程Procedure是一組為了完成特定功能的SQL語句集合,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名稱并給出參數來執行。
存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
由于存儲過程在創建時即在數據庫服務器上進行了編譯并存儲在數據庫中,所以存儲過程運行要比單個的SQL語句塊要快。同時由于在調用時只需用提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網絡流量、簡單網絡負擔。
1、 存儲過程的優點
A、 存儲過程允許標準組件式編程
存儲過程創建后可以在程序中被多次調用執行,而不必重新編寫該存儲過程的SQL語句。而且數據庫專業人員可以隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提高了程序的可移植性。
B、 存儲過程能夠實現較快的執行速度
如果某一操作包含大量的T-SQL語句代碼,分別被多次執行,那么存儲過程要比批處理的執行速度快得多。因為存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,并給出最終被存在系統表中的存儲計劃。而批處理的T-SQL語句每次運行都需要預編譯和優化,所以速度就要慢一些。
C、 存儲過程減輕網絡流量
對于同一個針對數據庫對象的操作,如果這一操作所涉及到的T-SQL語句被組織成一存儲過程,那么當在客戶機上調用該存儲過程時,網絡中傳遞的只是該調用語句,否則將會是多條SQL語句。從而減輕了網絡流量,降低了網絡負載。
D、 存儲過程可被作為一種安全機制來充分利用
系統管理員可以對執行的某一個存儲過程進行權限限制,從而能夠實現對某些數據訪問的限制,避免非授權用戶對數據的訪問,保證數據的安全。
? 系統存儲過程
系統存儲過程是系統創建的存儲過程,目的在于能夠方便的從系統表中查詢信息或完成與更新數據庫表相關的管理任務或其他的系統管理任務。系統存儲過程主要存儲在master數據庫中,以“sp”下劃線開頭的存儲過程。盡管這些系統存儲過程在master數據庫中,但我們在其他數據庫還是可以調用系統存儲過程。有一些系統存儲過程會在創建新的數據庫的時候被自動創建在當前數據庫中。
SQLServer語句和存儲過程是怎樣的
--列出SQL SERVER 所有表,字段名,主鍵,類型,長度,小數位數等信息 --在查詢分析器里運行即可,可以生成一個表,導出到EXCEL中 -- ====================================================== SELECT (case when a。
colorder=1 then d。name else ' end)表名, a。
colorder 字段序號, a。name 字段名, (case when COLUMNPROPERTY( a。
id,a。name,'IsIdentity')=1 then '√'else ' end) 標識, (case when (SELECT count(*) FROM sysobjects WHERE (name in (SELECT name FROM sysindexes WHERE (id = a。
id) AND (indid in (SELECT indid FROM sysindexkeys WHERE (id = a。id) AND (colid in (SELECT colid FROM syscolumns WHERE (id = a。
id) AND (name = a。name))))))) AND (xtype = 'PK'))>0 then '√' else ' end) 主鍵, b。
name 類型, a。length 占用字節數, COLUMNPROPERTY(a。
id,a。name,'PRECISION') as 長度, isnull(COLUMNPROPERTY(a。
id,a。name,'Scale'),0) as 小數位數, (case when a。
isnullable=1 then '√'else ' end) 允許空, isnull(e。 text,') 默認值, isnull(g。
[value],') AS 字段說明 FROM syscolumns a left join systypes b on a。xtype=b。
xusertype inner join sysobjects d on a。 id=d。
id and d。xtype='U' and d。
name'dtproperties' left join syscomments e on a。cdefault=e。
id left join sysproperties g on a。 id=g。
id AND a。colid = g。
smallid order by a。id,a。
colorder ------------------------------------------------------------------------------------------------- 列出SQL SERVER 所有表、字段定義,類型,長度,一個值等信息 并導出到Excel 中 -- ====================================================== -- Export all user tables definition and one sample value -- jan-13-2003,Dr。 Zhang -- ====================================================== 在查詢分析器里運行: SET ANSI_NULLS OFF GO SET NOCOUNT ON GO SET LANGUAGE 'Simplified Chinese' go DECLARE @tbl nvarchar(200),@fld nvarchar(200),@sql nvarchar(4000),@maxlen int,@sample nvarchar(40) SELECT d。
name TableName,a。name FieldName,b。
name TypeName,a。length Length,a。
isnullable IS_NULL INTO #t。
sql中是什么是存儲過程,有哪些作用
存儲過程是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,用戶通過指定存儲過程的名字并給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。
存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
由于存儲過程在創建時即在數據庫服務器上進行了編譯并存儲在數據庫中,所以存儲過程運行要比單個的SQL語句塊要快。同時由于在調用時只需用提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網絡流量、簡單網絡負擔。
轉載請注明出處華閱文章網 » sql語句的存儲過程