ukulele
Datenbank-Guru
- Beiträge
- 5.306
Nabend,
Ich übersetze grade eine Funktion von MS nach PG. Dabei ist mir die zunächst etwas merkwürdig erscheinende Unterscheidung zwischen LANGUAGE plpgsql und LANGUAGE sql aufgefallen. Was ist hier wann sinnvoll und warum wird das so merkwürdig über AS $$ am Anfang definiert und am Ende spezifiziert? Ist mir irgendwie nicht klar.
In der Funktion meckert er mir SET vCounter = vCounter + 1 an, was ist für plpgsql falsch daran?
Ich übersetze grade eine Funktion von MS nach PG. Dabei ist mir die zunächst etwas merkwürdig erscheinende Unterscheidung zwischen LANGUAGE plpgsql und LANGUAGE sql aufgefallen. Was ist hier wann sinnvoll und warum wird das so merkwürdig über AS $$ am Anfang definiert und am Ende spezifiziert? Ist mir irgendwie nicht klar.
In der Funktion meckert er mir SET vCounter = vCounter + 1 an, was ist für plpgsql falsch daran?
Code:
CREATE OR REPLACE FUNCTION "public"."function_escape_html"(vData VARCHAR(10485760))
RETURNS VARCHAR(10485760) AS $$
DECLARE vCounter SMALLINT = 0;
DECLARE vTag VARCHAR(100);
DECLARE vPos INT;
DECLARE vLength INT;
BEGIN
CREATE TEMP TABLE vTable(
counter SMALLINT NOT NULL,
tag VARCHAR(100) NOT NULL
);
WHILE vData LIKE '%</%>%'
AND vCounter <= 100
LOOP
SET vCounter = vCounter + 1
SET vPos = strpos(vData,'<')
SET vLength = strpos(right(vData,length(vData)-strpos(vData,'<')),'>')-1
SET 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) = '/' )
BEGIN
IF left(vTag,1) != '/'
BEGIN
INSERT INTO vTable(counter,tag)
SELECT vCounter,vTag
END
ELSE
BEGIN
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
SET vData = left(vData,vPos-1) + CHAR(27) + vTag + CHAR(127) + right(vData,length(vData)-vPos-vLength-1)
END
ELSE
BEGIN
SET vData = left(vData,vPos-1) + '<' + right(vData,length(vData)-vPos)
END
END LOOP
SET vData = replace(replace(replace(vData,'>','>'),CHAR(27),'<'),CHAR(127),'>')
RETURN vData
END;
$$ LANGUAGE plpgsql;