Проверить входной параметр и повысить исключение - PullRequest
0 голосов
/ 27 апреля 2019

В последнее время я работаю с некоторыми функциями, которые сейчас работают. Я хотел бы добавить некоторые функции, например: ", если входной параметр функции является строкой, он вызывает исключение, говоря что-то" . Как я могу это сделать?

 /*
 PLpgSQL function which behaves to aggregate the MIN(col)
 */
CREATE OR REPLACE FUNCTION searchMinimumValue (real,real) RETURNS real AS $$
DECLARE 
BEGIN
 IF $1 IS NULL OR $1 >= $2 THEN
    RETURN $2;
 ELSE
    RETURN $1;
 END IF;
 END;
 $$ LANGUAGE plpgsql;

 /*
Function which given the minimum value returned from the previous function,
adds the Laplacian noise.
Our upper bound is computed by doubling the epsilon value and then adding our minimum value found by the previous function.
The returned value from the function below will be the Laplace distribution value added to the output from the previous function.
 */
CREATE OR REPLACE FUNCTION addLaplacianNoiseMinimum(real) RETURNS real AS $$
DECLARE
  epsilon real := 1.2;
  sensivity real := (epsilon * 2) + $1;
  laplaceDistribution real;
BEGIN
  laplaceDistribution := sensivity / (epsilon);
  RETURN  $1 + laplaceDistribution;
END;
$$ LANGUAGE plpgsql;

CREATE AGGREGATE minimumLaplaceValue (real)
(
  sfunc = searchMinimumValue,
  stype = real,
  finalfunc = addLaplacianNoiseMinimum
); 

Как я уже говорил, я хотел бы напечатать что-то вроде этого: ЕСЛИ 1 $ НЕ ЧИСЛО, ЧЕМ ПОДНИМАЕТСЯ ИСКЛЮЧЕНИЕ «НЕПРАВИЛЬНЫЙ ПАРАМЕТР ВВОДА ТИПА»

1 Ответ

2 голосов
/ 28 апреля 2019

Я думаю, что вы не можете сделать это с Postgres - или вы не можете сделать это без нежелательных побочных эффектов.

Postgres - это система строгого типа - поэтому вся работа с типами должна выполняться Postgres.

Но вы можете перегружать функции для некоторого набора типов параметров:

CREATE OR REPLACE FUNCTION public.f1(numeric)
 RETURNS numeric
 LANGUAGE plpgsql
AS $function$
begin
  return $1;
end;
$function$

CREATE OR REPLACE FUNCTION public.f1(text)
 RETURNS text
 LANGUAGE plpgsql
AS $function$
begin
  raise exception 'only numeric type is supported';
end;
$function$

postgres=# select f1(10);
+----+
| f1 |
+----+
| 10 |
+----+
(1 row)

postgres=# select f1('ahoj');
ERROR:  only numeric type is supported
CONTEXT:  PL/pgSQL function f1(text) line 3 at RAISE

Но настоятельно не рекомендую использовать этот шаблон.Перегрузка - это дикое оружие - он может быть хорошим или плохим другом, и его следует использовать только тогда, когда это требуется и когда он может выполнять какую-то работу - его не следует использовать просто для вызова исключения.Это работа для системы типов postgres - она ​​работает лучше (хотя с другим и, возможно, на первый взгляд странным сообщением об ошибке).

...