呼叫儲存過程

2021-04-14 22:21:44 字數 4017 閱讀 1822

用乙個命令物件呼叫儲存過程,就是定義儲存過程的名稱,給過程的每個引數新增引數定義,然後執行命令。

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 ...