в любом случае я могу ускорить это. Я должен каждый раз вызывать хранимую процедуру, чтобы получить последнее значение от 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;
Посмотрите, как эту процедуру можно переписать в виде одного запроса на выборку. Затем вы можете запустить его один раз для многих значений в то же время (особенно, если эти receiptKeys уже хранящегося в базе данных где-то). – Thilo
это хорошая идея –