2

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

4

0 回答 0