LPAR-Funktion nach Umstellung auf 9x

Hallo,
die 2. Funktion funktioniert auf Postgres 8.0 aber nicht mehr auf Postgres 9.x.
Folgende Fehlermeldung:


FEHLER: Funktion lpad(text, integer, integer) existiert nicht
LINE 6: LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($…
^
HINT: Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.


********** Fehler **********

FEHLER: Funktion lpad(text, integer, integer) existiert nicht
SQL Status:42883
Hinweis:Keine Funktion stimmt mit dem angegebenen Namen und den Argumenttypen überein. Sie müssen möglicherweise ausdrückliche Typumwandlungen hinzufügen.
Zeichen:214





CREATE OR REPLACE FUNCTION btrsort(text)
RETURNS text AS
‘SELECT btrsort($1, 10);’
LANGUAGE sql VOLATILE;
ALTER FUNCTION btrsort(text)
OWNER TO postgres;

CREATE OR REPLACE FUNCTION btrsort(text, integer)
RETURNS text AS
$BODY$SELECT CASE WHEN $2-1>0
THEN
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM ‘^[^0-9]+’), ‘’), 1, 12), 12, ’ ') ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM ‘^[0-9]+’), ‘’), 1, 12), 12, 0) || btrsort(btrsort_nextunit(btrsort_nextunit($1)), $2-1)
ELSE
RPAD(SUBSTR(COALESCE(SUBSTRING($1 FROM ‘^[^0-9]+’), ‘’), 1, 12), 12, ’ ') ||
LPAD(SUBSTR(COALESCE(SUBSTRING(btrsort_nextunit($1) FROM ‘^[0-9]+’), ‘’), 1, 12), 12, 0)
END$BODY$
LANGUAGE sql VOLATILE;
ALTER FUNCTION btrsort(text, integer)
OWNER TO postgres;

CREATE OR REPLACE FUNCTION btrsort_nextunit(text)
RETURNS text AS
$BODY$SELECT CASE WHEN $1 ~ ‘[^0-9]+’ THEN
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM ‘[^0-9]+’))+1 ),
‘’ )
ELSE
COALESCE( SUBSTR( $1, LENGTH(SUBSTRING($1 FROM ‘[0-9]+’))+1 ),
‘’ )
END$BODY$
LANGUAGE sql VOLATILE;
ALTER FUNCTION btrsort_nextunit(text)
OWNER TO postgres;

Kann mir jemand helfen, wäre total dankbar.
Gruß Tedt

Sieht für mich so aus als ob Du Dich auf impliziete Casts verläßt, die es seit 8.3 nicht mehr gibt. lpad erwartet als 3. Parameter einen text, Du übergibst eine Zahl. Caste das einfach nach Text.

Das zweite int muß ein Text sein.

select lpad('test',10, 'bla')

Gruß Uwe

Hallo,
kann mir das jemand so umschreiben, dass das läuft?

Gruß tedt



test=*# select lpad('test',10, 0);
ERROR:  function lpad(unknown, integer, integer) does not exist
LINE 1: select lpad('test',10, 0);
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
test=*# select lpad('test',10, '0');
    lpad
------------
 000000test
(1 row)

Du siehst den Unterschied?

Oder so:

select lpad('test', 10, 0::text)

Gruß Uwe

Hallo,
vielen Dank für die Tips
und Gruß tedt