2009-11-03 51 views
0

我在oracle中創建了存儲過程。
我打電話通過我的asp.net代碼。
的程序是:如何獲取存儲過程的返回值?

PROCEDURE prc_GetNewQuestionNo(iNextQuestionNo IN OUT NUMBER) 
IS 
    iQuestionNo NUMBER ; 

BEGIN 
    Select MAX(QUESTIONNO)+ 1 INTO iQuestionNo 
    from tblIFFCOQUESTIONMASTER; 
    iNextQuestionNo:=iQuestionNo; 
END prc_GetNewQuestionNo; 

,我稱它在asp.net:

<Connection> 
    com.CommandType = CommandType.StoredProcedure; 
       com.CommandText = StoredProcedures.GET_NEW_QUESTION_NO; 
       com.Parameters.Add(new OracleParameter("iNextQuestionNo", OracleType.Number)).Direction = ParameterDirection.InputOutput; 

       adp = new OracleDataAdapter(com); 
       ds = new DataSet(); 
       adp.Fill(ds); 

如何獲得它的返回值?

+3

這不是回答你的問題,但是這是PL/SQL的一個可怕的一點。如果兩個會話在同一時間呼叫,他們會得到相同的答案和衝突。你應該使用Oracle序列。 – 2009-11-03 10:19:22

+0

我希望你沒有使用這個過程來生成主鍵。請參閱http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3379873654938 – 2009-11-03 10:22:17

回答

1

使用函數不是更好嗎?就像:

create function prc_GetNewQuestionNo(iNextQuestionNo IN NUMBER) 
return number AS 
    iQuestionNo NUMBER ; 
BEGIN 
    Select MAX(QUESTIONNO)+ 1 INTO iQuestionNo from tblIFFCOQUESTIONMASTER; 
    return iQuestionNo; 
END prc_GetNewQuestionNo; 
+0

是的,但我們也可以使用OUT參數。 – Ishita 2009-11-03 08:08:16

1

我想給您的回覆添加評論/問題保羅,但我couldnt。爲我的無知道歉,但是如果您使用SQL Server存儲過程的隔離級別爲serializable,那麼假設所有sql表在事務/存儲過程最後一次被鎖定時不給出併發問題?這是一個不好的做法?

+0

這個問題被標記爲Oracle,而不是SQL Server,所以這就是我的目標。 Oracle不會(默認情況下)對讀取進行序列化,這對於可伸縮應用程序來說是一件好事。正如WW在他們的評論中所說的那樣,生成一個主鍵的最佳方式是一個序列。請參閱此鏈接參考前面的鏈接的討論... http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4343369880986 – 2009-11-03 15:00:01

+0

謝謝保羅,這是一個誠實的問題,我在你說的第一個地方後有疑問 – GDalma 2009-11-03 15:37:53

+0

@GDalma - 這是提問題的最佳地點,最好從其他人的錯誤中學習:) – 2009-11-03 15:55:52

0

我想這個問題是在這裏

   adp = new OracleDataAdapter(com); 
       ds = new DataSet(); 
       adp.Fill(ds); 

你想要一個標值,而不是一個完整的記錄集..對不對?因此,而不是試圖這樣

//一些代碼片斷

db.ExecuteNonQuery(cmd);    
iNextQuestionNo= (decimal?)cmd.Parameters[0].Value; 

希望這有助於