Pregunta

Tengo que borrar ciertas tablas en la base de datos Oracle, sin embargo, cuando tengo problemas para ejecutar el siguiente código

public static void ClearDataTables(IList<string> tableNames)
        {
            string connectionString = "CONNECTIONSTRING";
            using (OracleConnection connection = new OracleConnection())
            {
                connection.ConnectionString = connectionString;
                connection.Open();
                foreach (string table in tableNames)
                {
                    OracleCommand command = connection.CreateCommand();
                    string sql = String.Format("DELETE FROM TOA_REPORTING.{0}", table);
                    command.CommandText = sql;
                    command.ExecuteNonQuery();
                }
                connection.Close();
            }
        }

Estoy llamando a este método con esta lista

ClearDataTables(new List<string> { "GROUP_DEFINITION", "GROUP_REPORT_EMAIL_LIST", "GROUP_EQUIPMENT_GROUP_STN_XREF"});

Ejecuta las dos primeras tablas bien, sin embargo, en la tercera, se atasca y la aplicación se ejecuta para siempre ...

Lo curioso es que cuando cambio "group_report_email_list" y "group_equipment_group_stn_xref", la aplicación se ejecuta para siempre después de que llega al segundo nombre de la tabla.

Entonces, en conclusión, la función se ejecuta para siempre cuando golpea "Group_equipment_group_stn_xref". He verificado que el SQL generado funciona probándolo en Toad.

¿Alguien más se encontró con este problema?

Editar: las dos primeras tablas se borran cuando se ejecuta.

Solución

string connectionString = "CONNECTIONSTRING";
            using (OracleConnection connection = new OracleConnection(connectionString))
            {
                connection.Open();
                OracleCommand command = connection.CreateCommand();
                OracleTransaction trans = connection.BeginTransaction();
                command.Transaction = trans;
                foreach (string table in tableNames)
                {
                    string sql = String.Format("DELETE FROM TOA_REPORTING.{0}", table);
                    command.CommandText = sql;
                    command.ExecuteNonQuery();
                }
                trans.Commit();
            }

¡Truncate habría sido una solución muy buena, sin embargo, no tengo los privilegios para hacerlo!

¿Fue útil?

Solución

¿Ha olvidado cometer sus cambios en Toad (o cualquier otro cliente)? Una transacción abierta hará que espere indefinidamente.

Otros consejos

¿Hay muchos datos en esa tabla? Esto explicaría por qué lleva tanto tiempo eliminar los datos.
De todos modos, sugiero usar TRUNC Para tablas de limpieza.

La gran cantidad de eliminaciones puede ser muy lenta, especialmente si las ejecuta en una transacción. Si no necesita la transacción, use:

truncate table YourTable

Si lo haces, divide el delete sobre transacciones de tamaño pequeño. Básicamente corre:

delete from YourTable where rownum < 100

hasta que la mesa esté vacía. Ver por ejemplo esto entrada en el blog.

Probablemente escribiría un procedimiento almacenado que realice todas las deleciones o truncamientos e invocara el SP una vez, en lugar de tener un lado del cliente.

Editar: también sería mejor no crear el objeto de comando dentro del bucle. Cree una vez fuera del bucle con un parámetro de nombre de tabla, y luego invócalo alimentarlo con un valor de parámetro diferente con cada iteración. Pero el SP debe ser preferido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top