:= hatte ich auch gesehen und versucht, habe wohl vergessen gleichzeitig mit ; abzuschließen, mein Fehler. Generell bin ich es von MSSQL gewohnt SET auch für das setzen von Variablen zu verwenden, das hat mich schon irritiert.
Der Unterschied zwischen SQL und PL/pgSQL ist doch recht komplex, aber scheinbar kann ich nur mit PL/pgSQL Variablen verwenden wie von MSSQL gewohnt, das irritiert mich tatsächlich mehr.
Difference between language sql and language plpgsql in PostgreSQL functions
PostgreSQL equivalent of MySQL query variables?
Das hatte ich auch schon in MSSQL getan, dem habe ich in PG Abhilfe geschaffen.
Das ist so nicht richtig. Die Funtion durchläuft Text und ersetzt < und > grundsätzlich wenn sie nicht zu einem HTML-Tag gehören (ausgenommen nicht geschlossene Tags). Aus '<asdf>A < B<br>C</asdf>' wird '<asdf>A < B<br>C</asdf>'.
Ja in MSSQL habe ich eine Tabellen-Variable, schnelles googlen hat daraus eine Temp-Tabelle gemacht. Arrays können aber nur Werte des selben Typs aufnehmen, richtig?
[CODE]
CREATE OR REPLACE FUNCTION "public"."function_escape_html"(vData VARCHAR(10485760))
RETURNS VARCHAR(10485760) AS $$
DECLARE vCounter SMALLINT := 0;
vTag VARCHAR(100);
vPos INT;
vLength INT;
BEGIN
CREATE TEMP TABLE vTable(
counter SMALLINT NOT NULL,
tag VARCHAR(100) NOT NULL
);
WHILE vData LIKE '%</%>%'
AND vCounter <= 100
LOOP
vCounter := vCounter + 1;
vPos := strpos(vData,'<');
vLength := strpos(right(vData,length(vData)-strpos(vData,'<')),'>')-1;
vTag := left(right(vData,length(vData)-vPos),vLength);
IF vTag NOT LIKE '%<%'
AND vTag NOT LIKE '%>%'
AND ( vData LIKE '%<' || vTag || '>%</' || vTag || '>%'
OR left(vTag,1) = '/' )
THEN
IF left(vTag,1) != '/'
THEN
INSERT INTO vTable(counter,tag)
SELECT vCounter,vTag;
ELSE
DELETE
FROM vTable
WHERE tag = right(vTag,length(vTag)-1)
AND counter = ( SELECT max(counter)
FROM vTable
WHERE tag = right(vTag,length(vTag)-1) );
END IF;
vData := left(vData,vPos-1) || chr(27) || vTag || chr(127) || right(vData,length(vData)-vPos-vLength-1);
ELSE
vData := left(vData,vPos-1) || '<' || right(vData,length(vData)-vPos);
END IF;
END LOOP;
vData := replace(replace(replace(vData,'>','>'),chr(27),'<'),chr(127),'>');
DROP TABLE vTable;
RETURN vData;
END;
$$ LANGUAGE plpgsql;
[/CODE]