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)
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.