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;