/**********************************************************************/ -- CONTINENTES /**********************************************************************/ CREATE OR REPLACE FUNCTION sui_continentes ( p_continente mug_continentes.continente%TYPE, p_nombre mug_continentes.nombre%TYPE ) RETURNS void AS $BODY$ DECLARE foid oid:= 'sui_continentes'::regproc::oid; BEGIN IF pg_try_advisory_lock(foid::bigint) THEN --perform pg_sleep(10); --RAISE NOTICE 'sui_continentes empezará la actualización'; ELSE --RAISE NOTICE 'sui_continentes esta siendo ejecutado en otro proceso.'; RETURN; END IF; BEGIN INSERT INTO mug_continentes ( continente, nombre ) VALUES ( p_continente, p_nombre ); EXCEPTION WHEN UNIQUE_VIOLATION THEN -- Actualiza el continente UPDATE mug_continentes SET nombre = p_nombre WHERE continente = p_continente; END; perform pg_advisory_unlock(foid::bigint); --quitamos el lock END; $BODY$ LANGUAGE 'plpgsql'; /**********************************************************************/ -- PAISES /**********************************************************************/ CREATE OR REPLACE FUNCTION sui_paises ( p_pais mug_paises.id_pais%TYPE, p_nombre mug_paises.descripcion%TYPE, p_continente mug_paises.continente%TYPE, p_codigo_iso mug_paises.codigo_iso%TYPE ) RETURNS void AS $BODY$ DECLARE foid oid:= 'sui_paises'::regproc::oid; BEGIN IF pg_try_advisory_lock(foid::bigint) THEN --perform pg_sleep(10); --RAISE NOTICE 'sui_paises empezará la actualización'; ELSE --RAISE NOTICE 'sui_paises esta siendo ejecutado en otro proceso.'; RETURN; END IF; BEGIN INSERT INTO mug_paises ( id_pais, descripcion, continente, codigo_iso ) VALUES ( p_pais, p_nombre, p_continente, p_codigo_iso ); EXCEPTION WHEN UNIQUE_VIOLATION THEN UPDATE mug_paises SET descripcion = p_nombre, continente = p_continente, codigo_iso = p_codigo_iso WHERE id_pais = p_pais; END; perform pg_advisory_unlock(foid::bigint); --quitamos el lock END; $BODY$ LANGUAGE 'plpgsql'; /**********************************************************************/ -- PROVINCIAS /**********************************************************************/ CREATE OR REPLACE FUNCTION sui_provincias ( p_provincia mug_provincias.id_provincia%TYPE, p_nombre mug_provincias.descripcion%TYPE, p_pais mug_provincias.id_pais%TYPE ) RETURNS void AS $BODY$ DECLARE foid oid:= 'sui_provincias'::regproc::oid; BEGIN IF pg_try_advisory_lock(foid::bigint) THEN --perform pg_sleep(10); --RAISE NOTICE 'sui_provincias empezará la actualización'; ELSE --RAISE NOTICE 'sui_provincias esta siendo ejecutado en otro proceso.'; RETURN; END IF; BEGIN INSERT INTO mug_provincias ( id_provincia, descripcion, id_pais ) VALUES ( p_provincia, p_nombre, p_pais ); EXCEPTION WHEN UNIQUE_VIOLATION THEN UPDATE mug_provincias SET descripcion = p_nombre, id_pais = p_pais WHERE id_provincia = p_provincia; END; perform pg_advisory_unlock(foid::bigint); --quitamos el lock END; $BODY$ LANGUAGE 'plpgsql'; /**********************************************************************/ -- DEPARTAMENTOS /**********************************************************************/ CREATE OR REPLACE FUNCTION sui_departamentos ( p_departamento mug_departamentos.id_departamento%TYPE, p_provincia mug_departamentos.id_provincia%TYPE, p_nombre mug_departamentos.descripcion%TYPE ) RETURNS void AS $BODY$ DECLARE foid oid:= 'sui_departamentos'::regproc::oid; BEGIN IF pg_try_advisory_lock(foid::bigint) THEN --perform pg_sleep(10); --RAISE NOTICE 'sui_departamentos empezará la actualización'; ELSE --RAISE NOTICE 'sui_departamentos esta siendo ejecutado en otro proceso.'; RETURN; END IF; BEGIN INSERT INTO mug_departamentos ( id_departamento, descripcion, id_provincia ) VALUES ( p_departamento, p_nombre, p_provincia ); EXCEPTION WHEN UNIQUE_VIOLATION THEN UPDATE mug_departamentos SET descripcion = p_nombre, id_provincia = p_provincia WHERE id_departamento = p_departamento; RAISE NOTICE 'Actualizado!'; END; perform pg_advisory_unlock(foid::bigint); --quitamos el lock END; $BODY$ LANGUAGE 'plpgsql'; /**********************************************************************/ -- LOCALIDADES /**********************************************************************/ CREATE OR REPLACE FUNCTION sui_localidades ( p_localidad mug_localidades.id_localidad%TYPE, p_dpto_partido mug_localidades.id_departamento%TYPE, p_nombre mug_localidades.descripcion%TYPE, p_nombre_abreviado mug_localidades.desc_abreviada%TYPE, p_ddn mug_localidades.ddn%TYPE ) RETURNS void AS $BODY$ DECLARE foid oid:= 'sui_localidades'::regproc::oid; BEGIN IF pg_try_advisory_lock(foid::bigint) THEN --perform pg_sleep(10); --RAISE NOTICE 'sui_localidades empezará la actualización'; ELSE --RAISE NOTICE 'sui_localidades esta siendo ejecutado en otro proceso.'; RETURN; END IF; BEGIN INSERT INTO mug_localidades ( id_localidad, descripcion, desc_abreviada, id_departamento, ddn ) VALUES ( p_localidad, p_nombre, p_nombre_abreviado, p_dpto_partido, p_ddn ); EXCEPTION WHEN UNIQUE_VIOLATION THEN UPDATE mug_localidades SET descripcion = p_nombre, desc_abreviada = p_nombre_abreviado, id_departamento = p_dpto_partido, ddn = p_ddn WHERE id_localidad = p_localidad; RAISE NOTICE 'Actualizado!'; END; perform pg_advisory_unlock(foid::bigint); --quitamos el lock END; $BODY$ LANGUAGE 'plpgsql';