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.

¿Debo utilizar Plpgsql para iterar a través de una tabla en lugar de usar SQL?

Tengo un trabajo que se ejecuta todas las noches para cargar cambios en una tabla temporal y aplicar esos cambios a la tabla principal.

CREATE TEMP TABLE IF NOT EXIST tmp AS SELECT * FROM mytable LIMIT 0;

<p>COPY tmp FROM PROGRAM '';</p>

<p>11 consultas SQL para actualizar 'mytable' basadas en datos de 'tmp'
```</p>

Tengo una gran cantidad de consultas para eliminar duplicados de tmp, actualizar valores en tmp, actualizar valores en la tabla principal e insertar nuevas filas en la tabla principal. ¿Es posible hacer un bucle sobre ambas tablas utilizando plpgsql en su lugar?
```sql
UPDATE mytable m
    SET "Field" = t."Field" + 1
FROM tmp t
WHERE (t."ID" = m."ID");

En este ejemplo, es un simple cambio de valor de columna. En cambio, quiero realizar operaciones más complejas tanto en la tabla principal como en la tabla temporal.

EDICIÓN: aquí hay un pseudocódigo de lo que imagino.

LOOP tmp t, mytable m
BEGIN
    -- operaciones en plpgsql incluyendo UPDATE, INSERT, DELETE
END
WHERE t.ID = m.ID;
Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible recorrer ambos tablas utilizando plpgsql. Puede usar un cursor para obtener los datos de la tabla temporal y luego realizar las operaciones requeridas en ambas tablas dentro de un bloque LOOP. Aquí tienes un ejemplo de cómo hacerlo:

    DECLARE
        tmp_cursor CURSOR FOR SELECT * FROM tmp;
        tmp_record tmp%ROWTYPE;
    BEGIN
        OPEN tmp_cursor;
        LOOP
            FETCH tmp_cursor INTO tmp_record;
            EXIT WHEN NOT FOUND;
    
            -- realiza las operaciones requeridas utilizando tmp_record y los datos de mytable
            -- puedes usar las instrucciones UPDATE, INSERT, DELETE aquí
    
        END LOOP;
    
        CLOSE tmp_cursor;
    END;
    

    Dentro del bloque LOOP, puedes acceder a los datos de la tabla temporal utilizando la variable tmp_record y a los datos de la tabla principal utilizando la sintaxis SQL estándar. Puedes realizar cualquier operación compleja en ambas tablas dentro de este bloque.

Comments are closed.