我有一个相当大而复杂的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成功执行而没有错误(并且内存使用率显着降低)?