我正在從Firebird將數據庫移植到PostgreSQL,並且有許多與類型轉換相關的錯誤。例如,讓我們以一個簡單的函數:PostgreSQL - 自動演算的類型?
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;
由於火鳥是相當靈活的類型本功能被稱爲是不同的:一些參數可能是另一種類型:整數/雙精度/時間戳。當然在Postgres的函數調用的f_Concat3 ('1', 2, 345.345)
導致類似的錯誤:
function f_Concat3(unknown, integer, numeric) not found.
該文檔recomended使用顯式轉換,如:
f_Concat3 ('1'::varchar, 2::varchar, 345.345::varchar)
我也可以爲所有可能的組合創建一個功能克隆鍵入可能發生的事情,它會起作用。解決錯誤的示例:
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;
但是,這是非常糟糕和醜陋的,它不適用於大功能。
重要提示:我們對所有DB都有一個通用代碼庫,並使用我們自己的語言來創建包含select查詢的應用程序對象(表單,報告等)。在函數調用中使用顯式轉換是不可能的,因爲我們將失去與其他數據庫的兼容性。
我感到困惑的是,整型參數不能被澆鑄成numeric
或double precision
,或date
/number
到string
。我甚至遇到integer
到smallint
的問題,反之亦然。大多數數據庫不像這樣。
這種情況有什麼最佳做法嗎?
顯式轉換是否有其他選擇?
您可以在調用函數時使用':: varchar'。 –
爲什麼你想創建一個新的功能? Postgres已經有一個'concat()'函數可以接受任意數量的參數? –
@a_horse_with_no_name concat()函數是例如。想象任何複雜的函數,其中任何輸入參數都可以寫成整數或字符串。火鳥會允許的。 – Ice2burn