CREATE OR REPLACE FUNCTION convert_weight( p_value numeric, p_from_unit text, p_to_unit text ) RETURNS numeric LANGUAGE plpgsql AS $$ DECLARE v_from_factor numeric; v_to_factor numeric; BEGIN SELECT factor INTO v_from_factor FROM product_uom WHERE lower(name) = lower(p_from_unit); IF v_from_factor IS NULL THEN RAISE EXCEPTION 'Unknown source unit: %', p_from_unit; END IF; SELECT factor INTO v_to_factor FROM product_uom WHERE lower(name) = lower(p_to_unit); IF v_to_factor IS NULL THEN RAISE EXCEPTION 'Unknown target unit: %', p_to_unit; END IF; RETURN p_value * v_from_factor / v_to_factor; END; $$;