我在回傳單個 bigint 值的兩個 Postgres 函式上遇到了奇怪的行為。第一個回傳正確的值,而第二個拋出錯誤:
錯誤:整數超出范圍
唯一的區別是第一個回傳一個以 ns 為單位的常數時間值,而第二個基于常數值計算它,為方便起見,以 s 為單位給出:
這個作業正常:
CREATE OR REPLACE FUNCTION c_getTime1()
RETURNS bigint AS $$
BEGIN
RETURN 12000000000; --12s in ns
END; $$
LANGUAGE plpgsql IMMUTABLE parallel safe;
這會引發錯誤。
CREATE OR REPLACE FUNCTION c_getTime2()
RETURNS bigint AS $$
BEGIN
RETURN 12*1000*1000*1000; --12s in ns
END; $$
LANGUAGE plpgsql IMMUTABLE parallel safe;
只是想知道,有什么大的區別嗎?我應該以某種方式對第二個函式的回傳進行型別轉換嗎?這兩個函式都使用直接方式呼叫:
select c_getTime1();
select c_getTime2();
Postgresql 資料庫版本是 13.3。
在此先感謝您的任何建議。
uj5u.com熱心網友回復:
選擇 pg_typeof(100); 回傳integer
。
RETURN 12*1000*1000*1000;
將首先計算為整數,然后轉換為 bigint。
https://www.postgresql.org/docs/current/datatype-numeric.html
首先計算然后發現ERROR: 22003: integer out of range
所以你應該改為
RETURN 12 ::bigint * 1000 ::bigint * 1000::bigint * 1000::bigint;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470301.html
標籤:PostgreSQL 功能 plpgsql postgresql-13
上一篇:在python中列印出素數串列