用乙個命令物件呼叫儲存過程,就是定義儲存過程的名稱,給過程的每個引數新增引數定義,然後執行命令。
1. 呼叫沒有返回值的儲存過程
呼叫儲存過程的最簡單示例是不給呼叫者返回任何值。下面定義了兩個這樣的儲存過程,乙個用於更新現有的region記錄,另乙個用於刪除指定的region記錄。
(1) 記錄的更新
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) 記錄的刪除
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返回的個數一樣...
儲存過程呼叫
size medium color blue 於 size small 儲存過程 包含三部分 宣告,執行部分,異常。可以有無引數程式和帶引數儲存過程。無參程式語法 1 create or replace procedure noparpro 2 as 3 begin 4 5 exception 6 ...
呼叫儲存過程
呵呵,測試了一下c 呼叫儲存過程 create procedure sp accountrole create categoryid int,rolename nvarchar 10 description nvarchar 50 roleid int output asdeclare count ...