Итак, я пытаюсь реализовать вызов хранимой процедуры через мое веб-приложение ASP.Net MVC.Вызов хранимой процедуры не является проблемой.Когда я вручную запускаю процедуру в SQL Developer, это занимает примерно 15 секунд, однако ее вызов в бэкэнде моего приложения приводит к совершенно другим результатам.Даже меньшие наборы данных могут занять около 20 минут.
Я попробовал несколько перестановок на следующих двух примерах c #, но безуспешно;наряду с попыткой установить локальную переменную в процедуре и использованием ее вместо параметра в скрипте.(Вероятно, стоит отметить, что у меня есть две другие операции в разных частях кода, которые являются более или менее зеркалами этих примеров).
using (var context = new DbContext())
{
var connStr = context.Database.Connection.ConnectionString;
using (var conn = new OracleConnection(connStr))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "PROCEDURE_NAME";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(":in_val", OracleDbType.Int32, val, ParameterDirection.Input); // val is an int that is passed to the method
cmd.ExecuteNonQuery();
conn.Close();
}
}
И
var in_val = new OracleParameter("in_val", OracleDbType.Long, val, ParameterDirection.Input);
context.Database.SqlQuery<object>("BEGIN PROCEDURE_NAME(:in_val); end;", in_val);
Вотхранимая процедура (отредактированная для пробела):
create or replace PROCEDURE PROCEDURE_NAME (in_val IN NUMBER)
IS
BEGIN
DELETE FROM "SOME_TABLE"
WHERE CAST_RUN_ID = in_val;
INSERT INTO "SOME_TABLE"
("col1",
"col2",
"col3")
SELECT distinct
sot."col1",
sot."col2",
sot."col3"
FROM SOME_OTHER_TABLE sot
WHERE sot.col1 = in_val AND sot.col4 IN
(SELECT col4 FROM (
SELECT sot1.*
FROM SOME_OTHER_TABLE sot1
WHERE sot1.col3 =
(SELECT MAX(sot2.col3) KEEP (DENSE_RANK FIRST ORDER BY col2 DESC NULLS LAST)
FROM SOME_OTHER_TABLE sot2
WHERE sot2.col1 = sot1.col1)));
end;
Суть в том, что процедура группирует данные и берет несколько строк из каждой группы.Я не совсем уверен, что проблема заключается в хранимой процедуре, поскольку она очень эффективна в SQL Developer.Я не уверен, что именно мне не хватает, так как у меня есть два отдельных метода, которые делают то же самое без этой проблемы.
Редактировать: я вижу ту же проблему с другим вызовом хранимой процедуры, котораяраньше бегал очень быстро.Так что, похоже, это не единичный случай.