2009-11-03 86 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; 

希望这有助于