Auf Thema antworten

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?

[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) + '&lt;' + right(vData,length(vData)-vPos)

       END

   END   LOOP


   SET       vData = replace(replace(replace(vData,'>','&gt;'),CHAR(27),'<'),CHAR(127),'>')


   RETURN vData

END;

$$ LANGUAGE plpgsql;[/CODE]


Zurück
Oben