當前位置:首頁 » 存儲配置 » 存儲過程定義者

存儲過程定義者

發布時間: 2022-07-05 23:04:05

⑴ 什麼是存儲過程有什麼優點

存儲過程是事先經過編譯並存儲在資料庫中的一段sql語句的集合,調用存儲過程可以簡化應用開發人員的很多工作,減少數據在資料庫和應用伺服器之間的傳輸,對於提高數據處理的效率是有好處的。

優點:

1、重復使用:存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。

2、減少網路流量:存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。

3、安全性:參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。

(1)存儲過程定義者擴展閱讀

存儲過程的缺點:

1、更改比較繁瑣:如果更改范圍大到需要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則仍需要更新程序集中的代碼以添加參數、更新 GetValue() 調用,等等,這時候估計比較繁瑣。

2、可移植性差:由於存儲過程將應用程序綁定到 SQL Server,因此使用存儲過程封裝業務邏輯將限制應用程序的可移植性。如果應用程序的可移植性在您的環境中非常重要,則需要將業務邏輯封裝在不特定於 RDBMS 的中間層中。

⑵ 資料庫中存儲過程到底有什麼意義

存儲過程是資料庫伺服器端的一段程序,它有兩種類型。一種類似於SELECT查詢,用於檢索數據,檢索到的數據能夠以數據集的形式返回給客戶。另一種類似於INSERT或DELETE查詢,它不返回數據,只是執行一個動作。有的伺服器允許同一個存儲過程既可以返回數據又可以執行動作。
存儲過程通常是一些經常要執行的任務,這些任務往往是針對大量的記錄而進行的。在伺服器上執行存儲過程,可以改善應用程序的性能。

⑶ 存儲過程的定義

存儲過程(Stored Procere)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,它存儲在資料庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象。在數據量特別龐大的情況下利用存儲過程能達到倍速的效率提升。

⑷ loEventDefinerMYSQL是什麼東西

DEFINER用於指明存儲過程是由哪個用戶定義的,默認存儲過程的定義者是存儲過程,跟存儲過程的使用許可權無關。
INVOKER用於指定哪些用戶有調用存儲過程的許可權,此時會以調用者的許可權去執行存儲過程。
默認情況下被執行的存儲過程具有其創建者的許可權,比如用戶A創建了存儲過程P1,用戶B運行存儲過程P1時,只有用戶A有操作許可權的數據才能被P1操作。
假設用戶A只有CREATE ROUTINE許可權,沒有select、update、delete等許可權,正常情況下存儲過程P1不能執行任何操作。如果在創建存儲過程P1時,使用 SQL SECURITY INVOKER特徵子句,讓存儲過程使用運行者的許可權,這樣即使P1的創建者沒有數據操作許可權,P1也可以正常使用。

⑸ 存儲過程到底是什麼!

在大型資料庫系統中,存儲過程和觸發器具有很重要的作用。無論是存儲過程還是觸發器,都是sql 語句和流程式控制制語句的集合。就
本質而言,觸發器也是一種存儲過程。存儲過程在運算時生成執行方式,所以,以後對其再運行時其執行速度很快。sql server 2000 不僅提供了用戶自定義存儲過程的功能,而且也提供了許多可作為工具使用的系統存儲過程。

12.1.1 存儲過程的概念
存儲過程(stored procere)是一組為了完成特定功能的sql 語句集,經編譯後存儲在資料庫。中用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。

在sql server 的系列版本中存儲過程分為兩類:系統提供的存儲過程和用戶自定義存儲過程。系統過程主要存儲在master 資料庫中並以sp_為前綴,並且系統存儲過程主要是從系統表中獲取信息,從而為系統管理員管理sql server 提供支持。通過系統存儲過程,ms sql server 中的許多管理性或信息性的活動(如了解資料庫對象、資料庫信息)都可以被順利有效地完成。盡管這些系統存儲過程被放在master 資料庫中,但是仍可以在其它資料庫中對其進行調用,在調用時不必在存儲過程名前加上資料庫名。而且當創建一個新資料庫時,一些系統存儲過程會在新資料庫中被自動創建。用戶自定義存儲過程是由用戶創建並能完成某一特定功能(如查詢用戶所需數據信息)的存儲過程。在本章中所涉及到的存儲過程主要是指用戶自定義存儲過程。

12.1.2 存儲過程的優點
當利用ms sql server 創建一個應用程序時,transaction-sql 是一種主要的編程語言。若運用transaction-sql 來進行編程,有兩種方法。其一是,在本地存儲transaction- sql 程序,並創建應用程序向sql server 發送命令來對結果進行處理。其二是,可以把部分用transaction-sql 編寫的程序作為存儲過程存儲在sql server 中,並創建應用程序來調用存儲過程,對數據結果進行處理存儲過程能夠通過接收參數向調用者返回結果集,結果集的格式由調用者確定;返回狀態值給調用者,指明調用是成功或是失敗;包括針對資料庫的操作語句,並且可以在一個存儲過程中調用另一存儲過程。

我們通常更偏愛於使用第二種方法,即在sql server 中使用存儲過程而不是在客戶計算機上調用transaction-sql 編寫的一段程序,原因在於存儲過程具有以下優點:

(1) 存儲過程允許標准組件式編程
存儲過程在被創建以後可以在程序中被多次調用,而不必重新編寫該存儲過程的sql 語句。而且資料庫專業人員可隨時對存儲過程進行修改,但對應用程序源代碼毫無影響(因為應用程序源代碼只包含存儲過程的調用語句),從而極大地提高了程序的可移植性。

(2) 存儲過程能夠實現較快的執行速度
如果某一操作包含大量的transaction-sql 代碼或分別被多次執行,那麼存儲過程要比批處理的執行速度快很多。因為存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的執行計劃。而批處理的transaction- sql 語句在每次運行時都要進行編譯和優化,因此速度相對要慢一些。

(3) 存儲過程能夠減少網路流量
對於同一個針對數據資料庫對象的操作(如查詢、修改),如果這一操作所涉及到的 transaction-sql 語句被組織成一存儲過程,那麼當在客戶計算機上調用該存儲過程時,網路中傳送的只是該調用語句,否則將是多條sql 語句,從而大大增加了網路流量,降低網路負載。

(4) 存儲過程可被作為一種安全機制來充分利用
系統管理員通過對執行某一存儲過程的許可權進行限制,從而能夠實現對相應的數據訪問許可權的限制,避免非授權用戶對數據的訪問,保證數據的安全。(我們將在14 章「sqlserver 的用戶和安全性管理」中對存儲過程的這一應用作更為清晰的介紹)

注意:存儲過程雖然既有參數又有返回值,但是它與函數不同。存儲過程的返回值只是指明執行是否成功,並且它不能像函數那樣被直接調用,也就是在調用存儲過程時,在存儲過程名字前一定要有exec保留字(如何執行存儲過程見本章下一字)。

⑹ oracle 存儲過程 begin end

Oracle存儲過程基礎知識
商業規則和業務邏輯可以通過程序存儲在Oracle中,這個程序就是存儲過程。
存儲過程是SQL, PL/SQL, java 語句的組合,它使你能將執行商業規則的代碼從你的應用程序中移動到資料庫。這樣的結果就是,代碼存儲一次但是能夠被多個程序使用。
要創建一個過程對象(proceral object),必須有 CREATE PROCEDURE 系統許可權。如果這個過程對象需要被其他的用戶schema 使用,那麼你必須有 CREATE ANY PROCEDURE 許可權。執行 procere 的時候,可能需要excute許可權。或者EXCUTE ANY PROCEDURE 許可權。如果單獨賦予許可權,如下例所示:
grant execute on MY_PROCEDURE to Jelly
調用一個存儲過程的例子:
execute MY_PROCEDURE( 'ONE PARAMETER');
存儲過程(PROCEDURE)和函數(FUNCTION)的區別。
function有返回值,並且可以直接在Query中引用function和或者使用function的返回值。
本質上沒有區別,都是 PL/SQL 程序,都可以有返回值。最根本的區別是: 存儲過程是命令, 而函數是表達式的一部分。比如:
select max(NAME) FROM
但是不能 exec max(NAME) 如果此時max是函數。
PACKAGE是function,procere,variables 和sql 語句的組合。package允許多個procere使用同一個變數和游標。

創建 procere的語法:

CREATE [ OR REPLACE ] PROCEDURE [ schema.]procere
[(argument [IN | OUT | IN OUT ] [NO COPY] datatype
[, argument [IN | OUT | IN OUT ] [NO COPY] datatype]...
)]
[ authid { current_user | definer }]
{ is | as } { pl/sql_subprogram_body |
language { java name 'String' | c [ name, name] library lib_name
}]
Sql 代碼:
CREATE PROCEDURE sam.credit (acc_no IN NUMBER, amount IN NUMBER) AS
BEGIN
UPDATE accounts
SET balance = balance + amount
WHERE account_id = acc_no;
END;
可以使用 create or replace procere 語句, 這個語句的用處在於,你之前賦予的excute許可權都將被保留。
IN, OUT, IN OUT用來修飾參數。
IN 表示這個變數必須被調用者賦值然後傳入到PROCEDURE進行處理。
OUT 表示PRCEDURE 通過這個變數將值傳回給調用者。
IN OUT 則是這兩種的組合。
authid代表兩種許可權:
定義者許可權(difiner right 默認),執行者許可權(invoker right)。
定義者許可權說明這個procere中涉及的表,視圖等對象所需要的許可權只要定義者擁有許可權的話就可以訪問。
執行者許可權則需要調用這個 procere的用戶擁有相關表和對象的許可權。

Oracle存儲過程的基本語法
1. 基本結構
CREATE OR REPLACE PROCEDURE 存儲過程名字
(
參數1 IN NUMBER,
參數2 IN NUMBER
) AS
變數1 INTEGER :=0;
變數2 DATE;
BEGIN
END 存儲過程名字
2. SELECT INTO STATEMENT
將select查詢的結果存入到變數中,可以同時將多個列存儲多個變數中,必須有一條
記錄,否則拋出異常(如果沒有記錄拋出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 變數1,變數2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...

3. IF 判斷
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4. while 循環
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5. 變數賦值
V_TEST := 123;
6. 用for in 使用cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;
7. 帶參數的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(變數值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
8. 用pl/sql developer debug
連接資料庫後建立一個Test WINDOW
在窗口輸入調用SP的代碼,F9開始debug,CTRL+N單步調試

9. Pl/Sql中執行存儲過程
在sql*plus中:
declare
--必要的變數聲明,視你的過程而定
begin
execute yourprocure(parameter1,parameter2,...);
end
/
在SQL/PLUS中調用存儲過程,顯示結果:
SQL>set serveoutput on --打開輸出
SQL>var info1 number; --輸出1
SQL>var info2 number; --輸出2
SQL>declare
var1 varchar2(20); --輸入1
var2 varchar2(20); --輸入2
var3 varchar2(20); --輸入2
BEGIN
pro(var1,var2,var3,:info1,:info2);
END;
/
SQL>print info1;
SQL>print info2;
註:在EXECUTE IMMEDIATE STR語句是SQLPLUS中動態執行語句,它在執行中會自動提交,類似於DP中FORMS_DDL語句,在此語句中str是不能換行的,只能通過連接字元"||",或著在在換行時加上"-"連接字元。

⑺ 什麼是存儲過程

定義:
將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來, 那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
講到這里,可能有人要問:這么說存儲過程就是一堆SQL語句而已啊?
Microsoft公司為什麼還要添加這個技術呢?
那麼存儲過程與一般的SQL語句有什麼區別呢?
存儲過程的優點:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少資料庫開發人員的工作量
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
存儲過程的種類:
1.系統存儲過程:以sp_開頭,用來進行系統的各項設定.取得信息.相關管理工作,
如 sp_help就是取得指定對象的相關信息
2.擴展存儲過程 以XP_開頭,用來調用操作系統提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用戶自定義的存儲過程,這是我們所指的存儲過程
常用格式
Create procere procee_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement
解釋:
output:表示此參數是可傳回的
with {recompile|encryption}
recompile:表示每次執行此存儲過程時都重新編譯一次
encryption:所創建的存儲過程的內容會被加密
如:
表book的內容如下
編號 書名 價格
001 C語言入門 $30
002 PowerBuilder報表開發 $52
實例1:查詢表Book的內容的存儲過程
create proc query_book
as
select * from book
go
exec query_book
實例2:加入一筆記錄到表book,並查詢此表中所有書籍的總金額
Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as
insert book(編號,書名,價格) Values(@param1,@param2,@param3)
select @param4=sum(價格) from book
go
執行例子:
declare @total_price money
exec insert_book '003','Delphi 控制項開發指南',$100,@total_price
print '總金額為'+convert(varchar,@total_price)
go
存儲過程的3種傳回值:
1.以Return傳回整數
2.以output格式傳回參數
3.Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中
實例3:設有兩個表為Proct,Order,其表內容如下:
Proct
產品編號 產品名稱 客戶訂數
001 鋼筆 30
002 毛筆 50
003 鉛筆 100
Order
產品編號 客戶名 客戶訂金
001 南山區 $30
002 羅湖區 $50
003 寶安區 $4
請實現按編號為連接條件,將兩個表連接成一個臨時表,該表只含編號.產品名.客戶名.訂金.總金額,
總金額=訂金*訂數,臨時表放在存儲過程中
代碼如下:
Create proc temp_sale
as
select a.產品編號,a.產品名稱,b.客戶名,b.客戶訂金,a.客戶訂數* b.客戶訂金 as總金額
into #temptable from Proct a inner join Order b on a.產品編號=b.產品編號
if @@error=0
print 'Good'
else
&n bsp; print 'Fail'
go

存儲過程介紹
一、先介紹一下什麼是存儲過程
存儲過程是利用SQL Server所提供的Tranact-SQL語言所編寫的程序。Tranact-SQL語言是SQL Server提供專為設計資料庫應用程序的語言,它是應用程序和SQL Server資料庫間的主要程序式設計界面。它好比Oracle資料庫系統中的Pro-SQL和Informix的資料庫系統能夠中的Informix-4GL語言一樣。這類語言主要提供以下功能,讓用戶可以設計出符合引用需求的程序:
1)、變數說明
2)、ANSI兼容的SQL命令(如Select,Update….)
3)、一般流程式控制制命令(if…else…、while….)
4)、內部函數

二、存儲過程的書寫格

CREATE PROCEDURE [擁有者.]存儲過程名[;程序編號]
[(參數#1,…參數#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行

其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數
(SQL Server 7.0以上版本),參數的使用方法如下:

@參數名 數據類型 [VARYING] [=內定值] [OUTPUT]

每個參數名前要有一個「@」符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。
[=內定值]相當於我們在建立資料庫時設定一個欄位的默認值,這里是為這個參數設定默認值。[OUTPUT]是用來指定該參數是既有輸入又有輸出值的,也就是在調用了這個存儲過程時,如果所指定的參數值是我們需要輸入的參數,同時也需要在結果中輸出的,則該項必須為OUTPUT,而如果只是做輸出參數用,可以用CURSOR,同時在使用該參數時,必須指定VARYING和OUTPUT這兩個語句。

例子:
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

例子說明:
該例子是建立一個簡單的存儲過程order_tot_amt,這個存儲過程根據用戶輸入的定單ID號碼(@o_id),由定單明細表(orderdetails)中計算該定單銷售總額[單價(Unitprice)*數量(Quantity)],這一金額通過@p_tot這一參數輸出給調用這一存儲過程的程序

三、在SQL Server中執行存儲過程

在SQL Server的查詢分析器中,輸入以下代碼:
declare @tot_amt int
execute order_tot_amt 1,@tot_amt output
select @tot_amt

以上代碼是執行order_tot_amt這一存儲過程,以計算出定單編號為1的定單銷售金額,我們定義@tot_amt為輸出參數,用來承接我們所要的結果

sql語句執行的時候要先編譯,然後執行。存儲過程就是編譯好了的一些sql語句。用的時候直接就可以用了。

存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化 後存儲在資料庫伺服器中,使用時只要調用即可。在ORACLE中,若干個 有聯系的過程可以組合在一起構成程序包。
使用存儲過程有以下的優點:
* 存儲過程的能力大大增強了SQL語言的功能和靈活性。存儲過程可 以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。
* 可保證數據的安全性和完整性。
# 通過存儲過程可以使沒有許可權的用戶在控制之下間接地存取資料庫,從而保證數據的安全。
# 通過存儲過程可以使相關的動作在一起發生,從而可以維護資料庫的完整性。
* 再運行存儲過程前,資料庫已對其進行了語法和句法分析,並給出 了優化執行方案。這種已經編譯好的過程可極大地改善SQL語句的性能。 由於執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執 行。
* 可以降低網路的通信量。
* 使體現企業規則的運算程序放入資料庫伺服器中,以便:
# 集中控制。
# 當企業規則發生變化時在伺服器中改變存儲過程即可,無須修改 任何應用程序。企業規則的特點是要經常變化,如果把體現企業規則的運 算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序 工作量非常之大(修改、發行和安裝應用程序)。如果把體現企業規則的 運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可 以了,應用程序無須任何變化。

⑻ 存儲過程和函數的區別

一、含義不同

1、存儲過程:存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。

2、函數:是由一個或多個 SQL 語句組成的子程序,可用於封裝代碼以便重新使用。函數限制比較多,如不能用臨時表,只能用表變數等

二、使用條件不同

1、存儲過程:可以在單個存儲過程中執行一系列 SQL 語句。而且可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。

2、函數:自定義函數諸多限制,有許多語句不能使用,許多功能不能實現。函數可以直接引用返回值,用表變數返回記錄集。但是,用戶定義函數不能用於執行一組修改全局資料庫狀態的操作。

三、執行方式不同

1、存儲過程:存儲過程可以返回參數,如記錄集,函數只能返回值或者表對象。存儲過程的參數有in,out,inout三種,存儲過程聲明時不需要返回類型。

2、函數:函數參數只有in,而函數需要描述返回類型,且函數中必須包含一個有效的return語句。

⑼ 存儲過程中定義參數的意義是什麼

存儲過程其實就是一個功能,定義參數就是為了這個調用者使用他所要的結果
舉個簡單例子:
手機是存儲過程(不變)
手機號碼卡是參數(可變)
換不同的號碼使用手機,功能可能不一樣,這個號碼是張三使用,那個號碼是李四使用。
這就是存儲過程中定義參數的意義。

⑽ 如何編寫存儲過程

設計存儲過程
幾乎任何可寫成批處理的 Transact-SQL 代碼都可用於創建存儲過程。

存儲過程的設計規則
存儲過程的設計規則包括:

CREATE PROCEDURE 定義本身可包括除下列 CREATE 語句以外的任何數量和類型的 SQL 語句,存儲過程中的任意地方都不能使用下列語句: CREATE DEFAULT CREATE TRIGGER
CREATE PROCEDURE CREATE VIEW
CREATE RULE

可在存儲過程中創建其它資料庫對象。可以引用在同一存儲過程中創建的對象,前提是在創建對象後再引用對象。

可以在存儲過程內引用臨時表。

如果在存儲過程內創建本地臨時表,則該臨時表僅為該存儲過程而存在;退出該存儲過程後,臨時表即會消失。

如果執行調用其它存儲過程的存儲過程,那麼被調用存儲過程可以訪問由第一個存儲過程創建的、包括臨時表在內的所有對象。

如果執行在遠程 Microsoft® SQL Server™ 2000 實例上進行更改的遠程存儲過程,則不能回滾這些更改。遠程存儲過程不參與事務處理。

存儲過程中參數的最大數目為 2100。

存儲過程中局部變數的最大數目僅受可用內存的限制。

根據可用內存的不同,存儲過程的最大大小可達 128 MB。
有關創建存儲過程的規則的更多信息,請參見 CREATE PROCEDURE。

限定存儲過程內的名稱
在存儲過程內部,如果用於諸如 SELECT 或 INSERT 這樣的語句的對象名沒有限定用戶,那麼用戶將默認為該存儲過程的所有者。在存儲過程內部,如果創建存儲過程的用戶沒有限定 SELECT、INSERT、UPDATE 或 DELETE 語句中引用的表名,那麼通過該存儲過程對這些表進行的訪問將默認地受到該過程的創建者許可權的限制。

如果有其他用戶要使用存儲過程,則用於語句 ALTER TABLE、CREATE TABLE、DROP TABLE、TRUNCATE TABLE、CREATE INDEX、DROP INDEX、UPDATE STATISTICS 和 DBCC 的對象名必須用該對象所有者的名稱限定。例如,Mary 擁有表 marytab,如果她希望其他用戶能夠執行使用該表的存儲過程,必須在該表用於上述某一條語句時對其表名進行限定。

此規則是必需的,因為運行存儲過程時將解析對象的名稱。如果未限定 marytab,而 John 試圖執行該過程,SQL Server 將查找 John 所擁有的名為 marytab 的表。

加密過程定義
如果要創建存儲過程,並且希望確保其他用戶無法查看該過程的定義,那麼可以使用 WITH ENCRYPTION 子句。這樣,過程定義將以不可讀的形式存儲。

存儲過程一旦加密其定義即無法解密,任何人(包括存儲過程的所有者或系統管理員)都將無法查看存儲過程定義。

SET 語句選項
當 ODBC 應用程序與 SQL Server 連接時,伺服器將自動設置會話的下列選項:

SET QUOTED_IDENTIFIER ON

SET TEXTSIZE 2147483647

SET ANSI_DEFAULTS ON

SET CURSOR_CLOSE_ON_COMMIT OFF

SET IMPLICIT_TRANSACTIONS OFF
這些設置將提高 ODBC 應用程序的可移植性。由於基於 DB-Library 的應用程序通常不設置這些選項,所以應在上述所列 SET 選項打開和關閉的情況下都對存儲過程進行測試。這樣可確保存儲過程始終能正確工作,而不管特定的連接在喚醒調用該存儲過程時可能設置的選項。需要特別設置其中一個選項的存儲過程,應在開始該存儲過程時發出一條 SET 語句。此 SET 語句將只對該存儲過程的執行保持有效,當該存儲過程結束時,將恢復原設置。

示例
A. 創建使用參數的存儲過程
下例創建一個在 pubs 資料庫中很有用的存儲過程。給出一個作者的姓和名,該存儲過程將顯示該作者的每本書的標題和出版商。

CREATE PROC au_info @lastname varchar(40), @firstname varchar(20)
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
JOIN publishers ON titles.pub_id = publishers.pub_id
WHERE au_fname = @firstname
AND au_lname = @lastname
GO

將出現一條說明該命令未返回任何數據也未返回任何行的消息,這表示已創建該存儲過程。

現在執行 au_info 存儲過程:

EXECUTE au_info Ringer, Anne
GO

下面是結果集:

au_lname au_fname title pub_name
--------- --------- --------------------- ----------------
Ringer Anne The Gourmet Microwave Binnet & Hardley
Ringer Anne Is Anger the Enemy? New Moon Books

(2 row(s) affected)

B. 創建使用參數默認值的存儲過程
下例創建一個存儲過程 pub_info2,該存儲過程顯示作為參數給出的出版商所出版的某本書的作者姓名。如果未提供出版商的名稱,該存儲過程將顯示由 Algodata Infosystems 出版的書籍的作者。

CREATE PROC pub_info2 @pubname varchar(40) = 'Algodata Infosystems'
AS
SELECT au_lname, au_fname, pub_name
FROM authors a INNER JOIN titleauthor ta ON a.au_id = ta.au_id
JOIN titles t ON ta.title_id = t.title_id
JOIN publishers p ON t.pub_id = p.pub_id
WHERE @pubname = p.pub_name

執行未指定參數的 pub_info2:

EXECUTE pub_info2
GO

下面是結果集:

au_lname au_fname pub_name
---------------- ---------------- --------------------
Green Marjorie Algodata Infosystems
Bennet Abraham Algodata Infosystems
O'Leary Michael Algodata Infosystems
MacFeather Stearns Algodata Infosystems
Straight Dean Algodata Infosystems
Carson Cheryl Algodata Infosystems
Dull Ann Algodata Infosystems
Hunter Sheryl Algodata Infosystems
Locksley Charlene Algodata Infosystems

(9 row(s) affected)

C. 執行用顯式值替代參數默認值的存儲過程
在下例中,存儲過程 showind2 的 @table 參數默認值是 titles。

CREATE PROC showind2 @table varchar(30) = 'titles'
AS
SELECT TABLE_NAME = sysobjects.name,
INDEX_NAME = sysindexes.name, INDEX_ID = indid
FROM sysindexes INNER JOIN sysobjects ON sysobjects.id = sysindexes.id
WHERE sysobjects.name = @table

列標題(例如,TABLE_NAME)可使結果更具可讀性。下面是該存儲過程顯示的 authors 表的情況:

EXECUTE showind2 authors
GO

TABLE_NAME INDEX_NAME INDEX_ID
---------- ---------- ----------
authors UPKCL_auidind 1
authors aunmind 2

(2 row(s) affected)

如果用戶未提供值,則 SQL Server 將使用默認表 titles:

EXECUTE showind2
GO

下面是結果集:

TABLE_NAME INDEX_NAME INDEX_ID
---------- ---------- ----------
titles UPKCL_titleidind 1
titles titleind 2

(2 row(s) affected)

D. 使用參數默認值 NULL 創建存儲過程
參數默認值可以是 NULL 值。在這種情況下,如果未提供參數,則 SQL Server 將根據存儲過程的其它語句執行存儲過程。不會顯示錯誤信息。

過程定義還可指定當不給出參數時要採取的其它某種措施。例如:

CREATE PROC showind3 @table varchar(30) = NULL
AS IF @table IS NULL
PRINT 'Give a table name'
ELSE
SELECT TABLE_NAME = sysobjects.name,
INDEX_NAME = sysindexes.name, INDEX_ID = indid
FROM sysindexes INNER JOIN sysobjects
ON sysobjects.id = sysindexes.id
WHERE sysobjects.name = @table

E. 使用包含通配符的參數默認值創建存儲過程
如果存儲過程將參數用於 LIKE 關鍵字,那麼默認值可包括通配符(%、_、[] 和 [^])。例如,可將 showind 修改為當不提供參數時顯示有關系統表的信息:

CREATE PROC showind4 @table varchar(30) = 'sys%'
AS SELECT TABLE_NAME = sysobjects.name,
INDEX_NAME = sysindexes.name, INDEX_ID = indid
FROM sysindexes INNER JOIN sysobjects
ON sysobjects.id = sysindexes.id
WHERE sysobjects.name LIKE @table

在存儲過程 au_info 的下列變化形式中,兩個參數都有帶通配符的默認值:

CREATE PROC au_info2 @lastname varchar(30) = 'D%',
@firstname varchar(18) = '%'
AS
SELECT au_lname, au_fname, title, pub_name
FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id
JOIN titles ON titleauthor.title_id = titles.title_id
JOIN publishers ON titles.pub_id = publishers.pub_id
WHERE au_fname LIKE @firstname
AND au_lname LIKE @lastname

如果執行 au_info2 時不指定參數,將顯示姓以字母 D 開頭的所有作者:

EXECUTE au_info2
GO

下面是結果集:

au_lname au_fname title pub_name
-------- -------- --------------------- -------------------
Dull Ann Secrets of Silicon Val Algodata Infosystems
del Castillo Innes Silicon Val Gastrono Binnet & Hardley
DeFrance Michel The Gourmet Microwave Binnet & Hardley

(3 row(s) affected)

下例在兩個參數的默認值已定義的情況下,省略了第二個參數,因此可找到姓為 Ringer 的所有作者的書和出版商:

EXECUTE au_info2 Ringer
GO

au_lname au_fname title pub_name
--------- --------- ---------------------- ----------------
Ringer Anne The Gourmet Microwave Binnet & Hardley
Ringer Anne Is Anger the Enemy? New Moon Books
Ringer Albert Is Anger the Enemy? New Moon Books
Ringer Albert Life Without Fear New Moon Books

(4 row(s) affected)

熱點內容
android音源 發布:2024-10-09 14:55:19 瀏覽:118
預編譯sql怎麼模糊查詢 發布:2024-10-09 14:31:24 瀏覽:217
我的世界伺服器被占違法嗎 發布:2024-10-09 14:27:50 瀏覽:390
資源配置如何發生作用 發布:2024-10-09 14:27:48 瀏覽:685
next數組演算法 發布:2024-10-09 14:25:38 瀏覽:138
存儲錄制視頻失敗 發布:2024-10-09 14:24:12 瀏覽:87
演算法結合硬體 發布:2024-10-09 14:11:37 瀏覽:997
安卓驅動編譯進內核 發布:2024-10-09 13:59:30 瀏覽:603
ubuntunginx編譯 發布:2024-10-09 13:27:36 瀏覽:725
怎麼查伺服器ip段 發布:2024-10-09 13:08:04 瀏覽:152