Bueno, pues doy el tema por solucionado.
No sé si será la mejor forma, pero esta función me ha resuelto la papeleta.
El problema estaba en que en el proyecto real, estoy usando unas tablas de municipios del INE, y resulta que hay algún caso de nombres de municipios repetidos. Para solventar eso, he limitado el select a 1, lo que me hace de forma arbitraria que esa id se asocie al primer municipio con ese nombre en la tabla municipios, pero creo que más no se puede hacer. Algún caso habrá que esté equivocado.
Si tuviera más datos como el CP, ese error se podría solventar, pero no dispongo de él.
Saludos y gracias. Pongo la versión definitiva de la función con el "limit"
Código SQL:
Ver originalCREATE OR REPLACE FUNCTION actualizar_id_mun() RETURNS void AS
$BODY$
DECLARE
x INTEGER;
BEGIN
x:=1;
WHILE x<(SELECT COUNT(*) FROM parcelas) LOOP
UPDATE parcelas SET id_municipio=(SELECT municipio.id FROM municipio WHERE municipio.nombre=parcelas.municipio LIMIT 1) WHERE parcelas.id=x;
x:=x+1;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;