POSTGRESQL convertire funzione da Mysql a Postgre

Devo convertire una funzione che calcola lo sconto commerciale il postgresql;
Ma non riesco a capire dove sbaglio …

CREATE OR REPLACE FUNCTION f_sconti (valore NUMERIC, sconto TEXT)
RETURNS NUMERIC AS $$
  DECLARE 
  elementi INTEGER;
  contatore INTEGER;
  stringa VARCHAR(15);
  parte VARCHAR(15);
  resto VARCHAR(15);
  BEGIN
	SET contatore = 0; /* imposto il contatore a 0' */
	SET stringa = REPLACE(sconto,",","."); /* prima rimpiazzo le virgole con i punti */
	SET stringa = REPLACE(stringa,"+",",+"); /* poi rimpiazzo i '+' con ',+' */
    SET stringa = REPLACE(stringa,"-",",-"); /* poi rimpiazzo i '-' con ',-' */
	SET elementi = CHAR_LENGTH(stringa) - CHAR_LENGTH(REPLACE(stringa,",","")) + 1;
	/* se sconto non  valorizzato allora ritorno il valore senza sconto */
	IF sconto = "" OR sconto IS NULL THEN
		RETURN valore;
	END IF;
	/* se ho solo un elemento allora ritorno lo sconto con un solo elemento */
	IF elementi = 1 then 
		SET valore = valore - (valore * CAST(stringa AS DECIMAL(12,4)) / 100);
		RETURN valore;
	END IF;
	/* inizio il loop per ricavare ogni parte */
	[ciclo]
	LOOP
	SET contatore = contatore + 1;
		IF contatore = 1 then
			set parte = SUBSTRING_INDEX(stringa,",",1);
		else
			set parte = SUBSTRING_INDEX(SUBSTRING_INDEX(stringa,",",contatore),",", -1);		
		END IF;
		set valore = valore - (valore * CAST(parte AS DECIMAL(12,4)) / 100);
		IF contatore = elementi THEN
		  END [ciclo];
		END IF;
	END LOOP [ciclo];
  RETURN valore;
END;
$$ LANGUAGE plpgsql;

Confesso di non aver mai utilizzato POSTGRESQL fino ad oggi… ma comunque sono riuscito a riscrivere la funzione.
Posso dire che postgresql potente… molto potente persino per le funzioni

vi posto la funzione per il calcolo degli sconti commerciali composti ( esempio : 50+20-3 )

CREATE FUNCTION "public"."f_sconti"(IN valore float8, IN sconto text) RETURNS "float8" 
	AS $BODY$DECLARE
    elementi INT;
    contatore INT;
    stringa text;
    parte text[];
    
BEGIN
    contatore := 0; /* imposto il contatore a 0' */
    stringa := REPLACE(sconto,',','.'); /* prima rimpiazzo le virgole con i punti */
    stringa := REPLACE(stringa,'+',',+'); /* poi rimpiazzo i '+' con ',+' */
    stringa := REPLACE(stringa,'-',',-'); /* poi rimpiazzo i '-' con ',-' */
    parte := string_to_array(stringa, ',');
    elementi := array_length(parte, 1);
    IF sconto = '' THEN
        RETURN valore;
    END IF;
    IF elementi > 0 THEN
	FOR contatore IN 1..elementi LOOP
            valore := valore - (valore * CAST(parte[contatore] AS float8) / 100);
        END LOOP;
    END IF;
    RETURN valore;
END;
$BODY$
	LANGUAGE plpgsql
	COST 10
	CALLED ON NULL INPUT
	SECURITY DEFINER
	IMMUTABLE;
ALTER FUNCTION "public"."f_sconti"(IN valore float8, IN sconto text) OWNER TO "postgres";