variable uso una resultado postgres into ejemplos declarar asignar postgresql postgresql-9.1 plpgsql

uso - variable en postgresql



Postgres SELECT... PARA ACTUALIZACIÓN en funciones (1)

Tengo dos preguntas sobre el uso de SELECT ... PARA ACTUALIZAR el bloqueo a nivel de fila en una función de Postgres:

  • ¿Importa qué columnas selecciono? ¿Tienen alguna relación con los datos que necesito bloquear y luego actualizar?

    SELECT * FROM table WHERE x=y FOR UPDATE;

    vs

    SELECT 1 FROM table WHERE x=y FOR UPDATE;

  • No puedo hacer una selección en una función sin guardar los datos en algún lugar, así que guardo en una variable ficticia. Esto parece hacky; ¿Es la forma correcta de hacer las cosas?

Aquí está mi función:

CREATE OR REPLACE FUNCTION update_message(v_1 INTEGER, v_timestamp INTEGER, v_version INTEGER) RETURNS void AS $$ DECLARE v_timestamp_conv TIMESTAMP; dummy INTEGER; BEGIN SELECT timestamp ''epoch'' + v_timestamp * interval ''1 second'' INTO v_timestamp_conv; SELECT 1 INTO dummy FROM my_table WHERE userid=v_1 LIMIT 1 FOR UPDATE; UPDATE my_table SET (timestamp) = (v_timestamp_conv) WHERE userid=v_1 AND version < v_version; END; $$ LANGUAGE plpgsql;


¿Importa qué columnas selecciono?

No, no importa. Incluso si se utiliza SELECT 1 FROM table WHERE ... FOR UPDATE , la consulta bloquea todas las filas que coinciden con las condiciones.

Si la consulta recupera filas de una unión, y no queremos bloquear filas de todas las tablas involucradas en la unión, pero solo filas de tablas específicas, una sintaxis de SELECT ... FOR UPDATE OF list-of-tablenames puede ser útil :
http://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-FOR-UPDATE-SHARE


No puedo hacer una selección en una función sin guardar los datos en algún lugar, así que guardo en una variable ficticia. Esto parece hacky; ¿Es la forma correcta de hacer las cosas?

En Pl / PgSql use un comando PERFORM para descartar el resultado de la consulta:
http://www.postgresql.org/docs/9.2/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-NORESULT

En lugar de:

SELECT 1 INTO dummy FROM my_table WHERE userid=v_1 LIMIT 1 FOR UPDATE;

utilizar:

PERFORM 1 FROM my_table WHERE userid=v_1 LIMIT 1 FOR UPDATE;