2017-09-22 54 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

相关问题