es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminación de filas antiguas en un esquema utilizando procedimientos almacenados.

¿Existe alguna manera de seleccionar todas las tablas en un esquema y eliminar las filas que no cumplen con la condición (mayores que cierta fecha) en un solo procedimiento? Puedo hacer lo mismo usando dos consultas separadas, sería algo así: SELECT table_name FROM information_schema.tables WHERE table_schema = 'nombreEsquema' y luego DELETE FROM table_name WHERE time < now()-'12 months'::interval; pero no sé cómo hacer lo mismo utilizando un único procedimiento almacenado. Supongo que debería utilizar un bucle en algún tipo de consulta SELECT, pero como nunca he trabajado realmente con bucles en postgres, siempre recibo algún tipo de excepción tratando de hacer esto. Cualquier ayuda será muy apreciada.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible seleccionar todas las tablas en un esquema y eliminar filas que no cumplan con la condición (más antiguas que una cierta fecha) en un solo procedimiento almacenado. Un enfoque para lograr esto es utilizar consultas de SQL dinámicas y recorrer los resultados de la consulta que devuelve la lista de tablas en el esquema.

    Aquí hay un ejemplo de procedimiento que utiliza SQL dinámico para recorrer la lista de tablas en el esquema y eliminar filas más antiguas que una cierta fecha:

    CREATE OR REPLACE FUNCTION delete_old_rows(schema_name text, max_age interval)
    RETURNS void AS $$
    DECLARE
      table_name text;
      query text;
    BEGIN
      -- Recorre las tablas en el esquema
      FOR table_name IN
        SELECT table_name
        FROM information_schema.tables
        WHERE table_schema = schema_name AND table_type = 'BASE TABLE'
      LOOP
        -- Construye la consulta para eliminar filas más antiguas que max_age
        query := format('DELETE FROM %I.%I WHERE time < now() - $1::interval', schema_name, table_name);
    
        -- Ejecuta la consulta
        EXECUTE query USING max_age;
      END LOOP;
    END;
    $$ LANGUAGE plpgsql;
    

    Puede llamar a este procedimiento con el nombre del esquema y la edad máxima de las filas que desea eliminar:

    SELECT delete_old_rows('nombreDelEsquema', '12 meses'::interval);
    

    Tenga en cuenta que este procedimiento asume que todas las tablas en el esquema tienen una columna llamada “time” que contiene una marca de tiempo o una fecha que puede usar para verificar la edad de las filas. Si sus tablas tienen diferentes nombres de columna o tipos de datos, deberá modificar la consulta dinámica en consecuencia.

Comments are closed.