2017-09-22 47 views
1

我正在編寫一個postgresql存儲過程,以基於特定條件從表中刪除記錄。如果我找到一個匹配,那麼我刪除該記錄。當通過Postgresql中的函數刪除記錄時,爲什麼會出現「超出範圍的bigint」錯誤?

這裏是我的存儲過程:

CREATE OR REPLACE FUNCTION DeleteSomeRecords(keys_param character varying) 
RETURNS void AS 
$$ 
BEGIN 
    DELETE FROM public.SomeTable 
    WHERE keyvalue = ANY(keys_param::bigint[]); 
END; 
$$ LANGUAGE plpgsql; 

場鍵值被定義爲BIGINT。

這是我如何把它從pgAdmin的4:

SELECT * FROM DeleteSomeRecords('{9226086781768122240,9506724121199784302}') 

我碰到下面的錯誤。

ERROR: value "9226086781768122240" is out of range for type bigint CONTEXT: SQL statement "DELETE FROM public.SomeTable WHERE keyvalue= ANY(keys_param::bigint[])" PL/pgSQL function DeleteSomeRecords(character varying) line 3 at SQL statement

我在做什麼錯在這裏?

有沒有更好的方法來寫這個函數?

我使用NpgSql通過C#/ .Net應用程序調用此函數。 我有我轉換爲逗號分隔字符串列表值:

string sKeyValues = "{" + string.Join(",", keyValue) + "}"; 

感謝

+1

'9226086781768122240'比的最大可能值更大'bigint'(這是'9223372036854775807')。 「SomeTable」表中的'keyvalue'類型是什麼? – Marth

+0

它被定義爲bigint。 – JohnB

+0

然後它不可能有'9226086781768122240'。在投射到'bigint'之前處理超出範圍的值,或者按@ClodoaldoNeto建議的投射到'numeric'。 – Marth

回答

2

鑄造它的數字:

WHERE keyvalue = ANY(keys_param::numeric[]) 
+0

謝謝你們! – JohnB

相關問題