2017-10-12 8 views
1

Quelle est la meilleure pratique pour faire des contraintes pour les arguments de fonction.
semblable à celui qui vérifie que l'enregistrement des nombres négatifs dans la fonction logarithme:Contraintes pour une fonction arguments dans PostgreSQL

SELECT log(-1, 1) 

lancers francs erreur:

[2201E] ERROR: cannot take logarithm of a negative number 

Jusqu'à présent, je trouve un moyen de le faire en utilisant PL/pgSQL l'intérieur d'un corps de la fonction, mais ça ne me semble pas une bonne solution.
Existe-t-il un moyen de créer des contraintes dans une déclaration de fonction?
Je voudrais voir quelque chose comme ceci: (ce code ne fonctionne pas)

CREATE OR REPLACE FUNCTION public.logloss(y_true BOOL NOTNULL, y_pred FLOAT NOTNULL) 

Ou peut-être (cela ne fonctionne pas aussi bien)

CASE WHEN __condition__ RAISE EXCEPTION 
    ELSE __function__body 
END 

Répondre

2

So far I found a way to do it using PL/pgSQL inside a function body but it doesn't look like a good solution for me.

Personnellement, je ne savoir ce qui pourrait être mauvais avec cette approche. C'est plutôt simple et clair, par ex.

create or replace function test_1(arg integer) 
returns integer language plpgsql as $$ 
begin 
    if arg < 0 then 
     raise exception 'The argument cannot be negative.'; 
    end if; 
    return arg; 
end $$; 

select test_1(-1); 

ERROR: The argument cannot be negative. 

Il n'y a pas de fonction intégrée pour vérifier automatiquement les arguments d'une fonction. Cependant, vous avez une alternative. Vous pouvez définir domains pour les arguments, exemple:

create domain non_negative_integer as integer 
check (value >= 0); 

create or replace function test_2(arg non_negative_integer) 
returns integer language plpgsql as $$ 
begin 
    return arg; 
end $$; 

select test_2(-1); 

ERROR: value for domain non_negative_integer violates check constraint "non_negative_integer_check"