【问题标题】:How to get stored procedure's returning value?如何获取存储过程的返回值?
【发布时间】:2010-12-12 13:20:59
【问题描述】:

我在 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);

如何得到它的返回值?

【问题讨论】:

  • 这不是您问题的答案,但这是一个可怕的 PL/SQL。如果两个会话同时调用它,他们将得到相同的答案并发生冲突。您应该使用 Oracle 序列。
  • 我希望您没有使用此过程来生成主键。请看asktom.oracle.com/pls/asktom/…

标签: asp.net oracle stored-procedures plsql


【解决方案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;

【讨论】:

    【解决方案2】:

    我想在 Paul 那里为您的回复添加评论/问题,但我做不到。为我的无知道歉,但是如果您使用的是具有可序列化隔离级别的 SQL Server 存储过程,难道不应该在事务/存储过程最后一次锁定所有 sql 表,而不会出现并发问题吗?这是一种不好的做法吗?

    【讨论】:

    • 这个问题被标记为 Oracle,而不是 SQL Server,所以这就是我的答案的目标。 Oracle 不会(默认情况下)序列化读取,这对于可扩展的应用程序来说是件好事。正如 WW 在他们的评论中所说的那样,以最佳方式生成主键的序列。有关引用早期链接的讨论,请参阅此链接...asktom.oracle.com/pls/asktom/…
    • 谢谢保罗,这是一个诚实的问题,在你说完之后我就开始怀疑了
    • @GDalma - 这是提问的正确地方,最好从别人的错误中学习:)
    【解决方案3】:

    我猜问题出在这里

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

    您想要一个标量值而不是整个记录集.. 对吗?所以改为这样尝试

    //一些代码sn-p

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      相关资源
      最近更新 更多