我有一个相当大且复杂的 Oracle 存储过程(约 2200 行),我可以从 SQL Developer 成功调用它,并使用以下命令在 2-3 秒内执行:
var o_my_data refcursor
begin
SCHEMA.pkg.get_data(i_p1 => 'val1',
i_p2 => 'p2',
i_p3 => 0,
i_p4 => 100000,
o_my_data => :o_my_data);
end;
/
print o_my_data
但是,当我从 ODP.NET 调用它时,它会引发以下异常:
unable to extend temp segment by 128 in tablespace TEMP1
调用存储过程的方式相当简单:
using (var connection = new OracleConnection(connectionString))
{
using (var command = connection.CreateCommand())
{
connection.Open();
command.CommandText = "SCHEMA.pkg.get_data";
command.CommandType = CommandType.StoredProcedure;
command.BindByName = true;
command.Parameters.Add("i_p1", "val1");
command.Parameters.Add("i_p2", "p2");
command.Parameters.Add("i_p3", 0);
command.Parameters.Add("i_p4", 1000000);
command.Parameters.Add("o_my_data", OracleDbType.RefCursor, ParameterDirection.Output);
// Fails here, before the result can even be read from the output parameter
command.ExecuteNonQuery();
connection.Close();
}
}
从 ODP.NET 调用时,似乎临时空间很快用完,达到 5gb 限制,然后在无法增加空间的地方抛出异常。
但是,如果它是存储过程的问题,为什么它可以从 SQL Developer 成功执行而没有错误(并且内存使用量显着降低)?