web-dev-qa-db-fra.com

Erreur: fonction de fonction (double précision, entier) n'existe pas

Je suis au milieu de la migration des requêtes qui fonctionnent depuis des siècles avec une base de données MySQL qui est maintenant à Postgres ayant la même structure. J'ai été coincé avec une fonction ronde simple qui se termine par le message d'erreur suivant.

Erreur: fonction de fonction (double précision, entier) n'existe pas

une partie de la sélection qui ne fonctionne pas:

round(floor(pools.available_capacity_in_kb/1024/1024/1024*100)/100,2) as free,

pools.available_capacity_in_kb est stocké comme Bigint dans la base de données (Postgres 10.9)

5
radek lopatecki

Le noyau du problème est ailleurs. PostgreSQL utilise une longue division pour des nombres entier et de Bigint (lorsque des deux parties de la division sont des valeurs int, des grossistes). Donc, le résultat de pools.available_capacity_in_kb/1024/1024/1024*100)/100 Est Bigint. Ce n'est probablement pas, ce que vous attendez.

postgres=# \df round
                          List of functions
+------------+-------+------------------+---------------------+------+
|   Schema   | Name  | Result data type | Argument data types | Type |
+------------+-------+------------------+---------------------+------+
| pg_catalog | round | double precision | double precision    | func |
| pg_catalog | round | numeric          | numeric             | func |
| pg_catalog | round | numeric          | numeric, integer    | func |
+------------+-------+------------------+---------------------+------+
(3 rows)

Il n'y a pas de fonction round pour bigint (car il n'a pas de sens). S'il vous plaît essayez de le réparer avec l'utilisation de la division de flotteur comme

pools.available_capacity_in_kb/1024/1024/1024*100)/100.0

Maintenant, le résultat sera numeric, et fonction round(numeric, int) existe - il devrait donc fonctionner.

1
Pavel Stehule