2013-04-20 4 views
0

в любом случае я могу ускорить это. Я должен каждый раз вызывать хранимую процедуру, чтобы получить последнее значение от oracle и update. Это мое последнее узкое место, поскольку его можно назвать тысячи раз. Я преобразовал другие вставки в массивные вставки вставки.застрял вызов процедуры oracle несколько раз

C# вызов оракул

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

C# оракул

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; 
+2

Посмотрите, как эту процедуру можно переписать в виде одного запроса на выборку. Затем вы можете запустить его один раз для многих значений в то же время (особенно, если эти receiptKeys уже хранящегося в базе данных где-то). – Thilo

+0

это хорошая идея –

ответ

0

Не подключайте на каждом вызове процедуры - отдельный код подключения и код вызова процедуры.


Ваша процедура может попасть в ситуацию получения дубликатов (представьте, что произойдет, если два сеанса называют его с тем же ключом, в то же время. - использование последовательности вместо максимального, если это возможно

0

Вероятно, вы можете уточнить результаты, извлекаемые следующий запрос в коде C#.

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