最近我一直在处理一些貌似有用的功能。
我想添加一些特性,例如:“如果函数输入参数是一个字符串,它会引发一个异常,说些什么。”。我该怎么做?

 /*
 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不是一个数字,则引发异常“错误类型输入参数”

最佳答案

我认为你不能用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类型系统的工作-它做得更好(尽管有不同的,可能在第一次查看奇怪的错误消息时)。

关于sql - 检查输入参数并引发异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55881185/

10-12 23:46