Auf Thema antworten

:= 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 &lt; B&lt;br&gt;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) || '&lt;' || right(vData,length(vData)-vPos);

       END IF;

   END   LOOP;


   vData := replace(replace(replace(vData,'>','&gt;'),chr(27),'<'),chr(127),'>');


   DROP TABLE vTable;


   RETURN vData;

END;

$$ LANGUAGE plpgsql;

[/CODE]


Zurück
Oben