呼叫儲存過程 zt

2022-01-15 05:39:19 字數 4705 閱讀 8366

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

為了使本節的示例更有說服力,下面定義一組可以用於插入、更新和刪除

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