2017-09-22 6 views
1

Je travaille sur l'écriture d'une procédure stockée postgresql pour supprimer des enregistrements d'une table en fonction d'un certain critère. Si je trouve une correspondance, alors je supprime l'enregistrement.Pourquoi une erreur "hors plage pour bigint" est-elle générée lors de la suppression d'enregistrements via une fonction dans Postgresql?

Voici ma procédure stockée:

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; 

Le keyvalue de champ est défini comme bigint.

Voici comment je l'appelle de PgAdmin 4:

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

Je reçois l'erreur suivante.

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

Qu'est-ce que je fais mal ici?

Existe-t-il un meilleur moyen d'écrire cette fonction? J'appelle cette fonction via une application C#/.Net en utilisant NpgSql. J'ai une des valeurs de la liste que je convertir en une chaîne séparée par des virgules:

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

Merci

+1

'9226086781768122240' est plus grande que la plus grande valeur possible d'un 'bigint' (qui est' 9223372036854775807'). Quel est le type de 'keyvalue' dans la table' SomeTable'? – Marth

+0

Il est défini comme un bigint. – JohnB

+0

Ensuite, il n'est pas possible d'avoir '9226086781768122240' dedans. Soit gérer les valeurs hors limites avant de les transtyper en 'bigint', soit les convertir en' numeric' comme suggéré par @ClodoaldoNeto. – Marth

Répondre

2

Moulage à numérique:

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

Merci les amis! – JohnB