多次卡住调用oracle程序

Posted

技术标签:

【中文标题】多次卡住调用oracle程序【英文标题】:stuck calling oracle procedure multiple times 【发布时间】:2013-04-20 00:36:00 【问题描述】:

我可以通过任何方式加快速度。我每次都必须调用存储过程才能从 oracle 获取其最新值并进行更新。这是我的最后一个瓶颈,因为它可以被调用数千次。我将其他插入转换为数组绑定批量插入。

c#调用oracle

for (int i = 0; i < r.receiptkey.Count(); i++)
       
  ld.receiptlinenumber.Add(AsnGetNextAvailableReceiptLineNumber(r.receiptkey[i]));

c# oracle

 public string AsnGetNextAvailableReceiptLineNumber(string myReceiptKey)
    
        using (OracleCommand cmd = new OracleCommand())
        
            OracleConnection conn;
            conn = new OracleConnection(ConnectionStringOracle);
            cmd.CommandText = "bpPack.GetNextReceiptLineNumber";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Connection = conn;

            cmd.Parameters.Add(new OracleParameter("iReceiptKey", OracleDbType.Varchar2, 10));
            cmd.Parameters.Add(new OracleParameter("oRetValue", OracleDbType.Varchar2, 5)).Direction = ParameterDirection.Output;
            cmd.Parameters["iReceiptKey"].Value = myReceiptKey;
            conn.Open();
            try
            
                cmd.ExecuteNonQuery();
            
            catch (Exception e9)
            
                return "Error" + e9.Message;
            
            return cmd.Parameters["oRetValue"].Value.ToString();
        
    

plsql

  PROCEDURE GetNextReceiptLineNumber(
   iReceiptKey IN VARCHAR2,
   oRetValue OUT VARCHAR2)
  IS
    xreceiptlinenumber VARCHAR2 (5);
    xreceiptlinecount  NUMBER (10);
  BEGIN
     xreceiptlinenumber :='';
     xreceiptlinecount  := 0;
     SELECT MAX (receiptlinenumber)
    INTO xreceiptlinenumber
     FROM receiptdetail
    WHERE receiptkey        = iReceiptKey;
   IF (xreceiptlinenumber IS NULL) THEN
    xreceiptlinecount    := 0;
  ELSE
    xreceiptlinecount := TO_NUMBER (LTRIM (xreceiptlinenumber, '0'));
  END IF;
  xreceiptlinecount := xreceiptlinecount + 1;
  oRetValue         := LPAD (xreceiptlinecount, 5, '0');
  END GetNextReceiptLineNumber;

【问题讨论】:

看起来该过程可以重写为单个 SELECT 查询。然后你可以同时为多个值运行一次(特别是如果这些receiptKeys 已经存储在数据库中的某个地方)。 【参考方案1】:

不要在每个过程调用上连接 - 单独的连接代码和您的过程调用代码。


您的过程可能会出现重复的情况(想象一下如果两个会话同时使用相同的键调用它会发生什么 - 如果可能,使用序列而不是最大值。

【讨论】:

【参考方案2】:

也许您可以在您的 C# 代码中详细说明通过以下查询检索到的结果。

SELECT receiptkey, LPAD (nvl((to_number(MAX(receiptlinenumber))+1),'0'), 5, '0') as NextReceiptLineNumber
FROM receiptdetail
group by receiptkey

【讨论】:

以上是关于多次卡住调用oracle程序的主要内容,如果未能解决你的问题,请参考以下文章

如何修复调用 API 时卡住的颤振应用程序(仅限发布版本)

windows service调用FindWindow 怎么不行

对oracle数据库进行增删改更新操作,executeUpdate()执行卡住了

Android service与activity绑定调用问题

windows service调用FindWindow 怎么不行

Java程序卡住,在jstack输出调用栈之后恢复,可能是啥原因