0

どうにかしてこれをスピードアップできます。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;
4

2 に答える 2

0

プロシージャ コールごとに接続しないでください。接続コードとプロシージャ コール コードを分けてください。


手順が重複する状況に陥る可能性があります (2 つのセッションが同時に同じキーでそれを呼び出すとどうなるか想像してみてください。可能であれば max の代わりに sequence を使用してください。

于 2013-04-20T05:58:21.213 に答える