用乙個命令物件呼叫儲存過程,就是定義儲存過程的名稱,給過程的每個引數新增引數定義,然後用上一節中給出的方法執行命令。
為了使本節的示例更有說服力,下面定義一組可以用於插入、更新和刪除
northwind
示例資料庫中
region
表的記錄的儲存過程,這個表儘管很小,但可以用於給每種常見的儲存過程編寫示例。
1. 呼叫沒有返回值的儲存過程
呼叫儲存過程的最簡單示例是不給呼叫者返回任何值。下面定義了兩個這樣的儲存過程,乙個用於更新現有的
region
記錄,另乙個用於刪除指定的
region
記錄。(1)
記錄的更新
更新region
記錄是很簡單的,因為
(假定主鍵碼不能被更新
)只有乙個列可以更新。直接在
sql server
storedprocs.sql
檔案,在該檔案中包含本節中的所有儲存過程:
create procedure regionupdate (@regionid integer,
@regiondescription nchar(50)) as
set nocount off
update region
set regiondescription = @regiondescription
where regionid = @regionid
go給真實世界中的表執行更新命令,需要重複選擇和返回已更新的記錄。這個儲存過程有兩個輸入引數
(@regionid
和@regiondescription)
,對資料庫執行
update
語句。要在
.net
**中執行這個儲存過程,需要定義乙個
sql命令,並執行它:
sqlcommand acommand = new sqlcommand("regionupdate", conn);
acommand.commandtype = commandtype.storedprocedure
;acommand.parameters.add(new sqlparameter ("@regionid",
sqldbtype.int,
0, "regionid"));
acommand.parameters.add(new sqlparameter("@regiondescription",
sqldbtype.nchar,
50,
"regiondescription"));
acommand.updatedrowsource = updaterowsource.none;
這段**建立了乙個新
sqlcommand
物件acommand
,並把它定義為乙個儲存過程。然後,依次新增每個引數,最後把儲存過程的結果設定為
updaterowsource
列舉中的乙個值。
該儲存過程有兩個引數:要更新的
region
記錄的惟一主鍵碼;給這個記錄的新描述。建立好命令後,就可以用下面的命令執行它:
acommand.parameters[0].value = 999;
acommand.parameters[1].value = "south western england";
acommand.executenonquery();
這幾個命令設定了每個引數的值,然後執行儲存過程。該過程沒有返回值,因此使用
executenonquery
就足夠了。命令引數可以像前面那樣依次設定,或者按照名稱來設定。
(2)
記錄的刪除
下乙個儲存過程可用於從資料庫中刪除乙個
region
記錄:create procedure regiondelete (@regionid integer) as
set nocount off
delete from region
where regionid = @regionid
go這個過程只需要該記錄的主鍵碼值。下面的**使用
sqlcommand
物件呼叫這個儲存過程:
sqlcommand acommand = new sqlcommand("regiondelete" , conn);
acommand.commandtype = commandtype.storedprocedure;
acommand.parameters.add(new sqlparameter("@regionid" , sqldbtype.int , 0 ,
"regionid"));
acommand.updatedrowsource = updaterowsource.none;
這個命令只接收乙個引數,如下面的**所示,它執行
regiondelete
儲存過程,這是乙個按照名稱設定引數的示例:
acommand.parameters["@regionid"].value= 999;
acommand.executenonquery();
2. 呼叫返回輸出引數的儲存過程
前面兩個執行儲存過程的示例都沒有返回值。如果儲存過程包含輸出引數,則它們就需要在
.net
客戶程式中定義,以便在過程返回時填充其輸出引數。下面的示例說明了如何在資料庫中插入記錄,把該記錄的主鍵碼返回給呼叫者。
記錄的插入
region
表僅由乙個主鍵碼
(regionid)
和描述字段
(regiondescription)
組成。要插入乙個記錄,需要生成該數字主鍵碼,再把新行插入到資料庫中。在這個示例中,通過在儲存過程中建立乙個主鍵碼,簡化了主鍵碼的生成。使用的方法未經過任何加工,這就是本章的後面用一節的篇幅介紹鍵的生成的原因。下面使用這個示例就足夠了:
create procedure regioninsert(@regiondescription nchar(50),
@regionid integer output)as
set nocount off
select @regionid = max(regionid)+ 1
from region
insert into region(regionid, regiondescription)
values(@regionid, @regiondescription)
go插入過程建立乙個新
region
記錄,在資料庫本身生成主鍵碼值時,這個值作為輸出引數從過程返回
(@regionid)
。這對於這個簡單示例來說就足夠了,但對於比較複雜的表
(特別是有預設值的表
),通常不使用輸出引數,而選擇整個插入的行,把該行返回給呼叫者。
.net
類可以處理這兩種情況。
sqlcommand acommand = new sqlcommand("regioninsert" , conn);
acommand.commandtype = commandtype.storedprocedure;
acommand.parameters.add(new sqlparameter("@regiondescription" ,
sqldbtype.nchar ,
50 ,
"regiondescription"));
acommand.parameters.add(new sqlparameter("@regionid" ,
sqldbtype.int,
0 ,
parameterdirection.output ,
false ,
0 ,
0 ,
"regionid" ,
datarowversion.default ,
null));
acommand.updatedrowsource = updaterowsource.outputparameters;
其中引數的定義比較複雜。第二個引數
@regionid
定義為包含其引數定向
,在這個示例中是
output
。除這個標誌之外,該示例還在最後一行使用
updaterowsource
列舉表示通過輸出引數從這個儲存過程返回的資料。當從乙個
datatable(
詳見本章後面的內容
)中執行儲存過程呼叫時,主要使用這個標誌。
呼叫這個儲存過程類似於前面的示例,但在這個例項中,需要在執行完過程後讀取輸出參
數:acommand.parameters["@regiondescription"].value = "south west";
acommand.executenonquery();
int newregionid = (int) acommand.parameters["@regionid"].value;
在執行完命令後,讀取
@regionid
引數的值
,並把它的資料型別轉換為整型。
如果呼叫的儲存過程返回輸出引數和一組記錄行,該怎麼辦?在該例項中,應定義合適的引數,而不是呼叫
executenonquery()
,應呼叫另乙個方法(例如
executereader())
,遍歷所有的返回記錄。
Oracle儲存過程呼叫儲存過程
oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...
呼叫儲存過程
用乙個命令物件呼叫儲存過程,就是定義儲存過程的名稱,給過程的每個引數新增引數定義,然後執行命令。1.呼叫沒有返回值的儲存過程 呼叫儲存過程的最簡單示例是不給呼叫者返回任何值。下面定義了兩個這樣的儲存過程,乙個用於更新現有的region記錄,另乙個用於刪除指定的region記錄。1 記錄的更新 cre...
儲存過程呼叫
size medium color blue 於 size small 儲存過程 包含三部分 宣告,執行部分,異常。可以有無引數程式和帶引數儲存過程。無參程式語法 1 create or replace procedure noparpro 2 as 3 begin 4 5 exception 6 ...