2017-10-12 3 views
1

Was ist die beste Praxis, um Einschränkungen für Funktionsargumente zu machen.
ähnlich wie derjenige, dass der Check negative Zahlen innerhalb Logarithmus-Funktion überprüft:Einschränkungen für eine Funktion Argumente in PostgreSQL

SELECT log(-1, 1) 

wirft Fehler:

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

Bisher fand ich einen Weg, es zu tun Körper mit PL/pgSQL in einer Funktion aber es sieht nicht wie eine gute Lösung für mich aus.
Gibt es eine Möglichkeit, Einschränkungen in einer Funktionsdeklaration zu machen?
Ich möchte so etwas sehen: (dieser Code nicht funktioniert)

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

Oder vielleicht

CASE WHEN __condition__ RAISE EXCEPTION 
    ELSE __function__body 
END 

Antwort

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.

Persönlich glaube ich nicht (das nicht so gut funktionieren) wissen, was mit diesem Ansatz falsch sein könnte. Es ist ziemlich einfach und klar, z.B.

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. 

Es gibt keine integrierte Funktion zum automatischen Überprüfen von Argumenten einer Funktion. Sie haben jedoch eine Alternative. Sie können domains für Argumente definieren, zum Beispiel:

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" 
Verwandte Themen