Ich arbeite an der Portierung von Datenbank von Firebird zu PostgreSQL und viele Fehler im Zusammenhang mit Typ Besetzung. Zum Beispiel wollen wir eine einfache Funktion übernehmen:PostgreSQL - Auto Cast für Typen?
CREATE OR REPLACE FUNCTION f_Concat3 (
s1 varchar, s2 varchar, s3 varchar
)
RETURNS varchar AS
$body$
BEGIN
return s1||s2||s3;
END;
$body$ LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER LEAKPROOF COST 100;
Wie Firebird ziemlich flexibel Typen wurde diese Funktionen anders genannt: einige der Argumente könnte ein anderer Typ sein: integer/double precision/Zeitstempel. Und natürlich in Postgres Funktionsaufruf f_Concat3 ('1', 2, 345.345)
verursacht ein Fehler wie:
function f_Concat3(unknown, integer, numeric) not found.
Die Dokumentation empfohlen wird wie eine explizite Umwandlung zu verwenden:
f_Concat3 ('1'::varchar, 2::varchar, 345.345::varchar)
Auch kann ich eine Funktion Klone für alle möglichen Kombinationen erstellen von Typen, was auftreten könnte und es wird funktionieren. Ein Beispiel, um Fehler zu beheben:
CREATE OR REPLACE FUNCTION f_Concat3 (
s1 varchar, s2 integer, s3 numeric
)
RETURNS varchar AS
$body$
BEGIN
return s1::varchar||s2::varchar||s3::varchar;
END;
Allerdings ist dies sehr schlecht und hässlich und es wird nicht mit großen Funktionen arbeiten.
Wichtig: Wir haben eine allgemeine Codebasis für alle Datenbanken und verwenden unsere eigene Sprache, um Anwendungsobjekte (Formulare, Berichte usw.) zu erstellen, die ausgewählte Abfragen enthalten. Es ist nicht möglich explizite Cast-Funktionsaufrufe zu verwenden, da wir die Kompatibilität mit anderen DB verlieren.
Ich bin verwirrt, dass das Integer-Argument kann nicht auf die numeric
oder double precision
oder date
/number
zu einem string
gegossen werden. Ich habe sogar Probleme mit integer
bis smallint
und umgekehrt. Die meisten Datenbanken verhalten sich nicht so.
Gibt es eine Best Practice für eine solche Situation?
Gibt es Alternativen für explizite Besetzung?
Sie können einfach ':: varchar' verwenden, wenn Sie die Funktion aufrufen. –
Warum möchten Sie eine neue Funktion erstellen? Postgres hat bereits eine 'concat()' -Funktion, die eine beliebige Anzahl von Argumenten akzeptiert? –
@a_horse_with_no_name die Funktion concat() ist zum Beispiel. Stellen Sie sich einfach eine komplexe Funktion vor, bei der beliebige Eingabeargumente als Integer oder String geschrieben werden können. Firebird wird das erlauben. – Ice2burn