Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
postgresql中指数函数的存储过程_Postgresql_Stored Procedures_Exponential_Postgresql 9.0 - Fatal编程技术网

postgresql中指数函数的存储过程

postgresql中指数函数的存储过程,postgresql,stored-procedures,exponential,postgresql-9.0,Postgresql,Stored Procedures,Exponential,Postgresql 9.0,在PostgreSQL中,我得到一个错误: ERROR: argument for function "exp" too big SQL state: 22003 我需要为指数函数编写一个存储过程,如下所示: 如果exp(value)抛出函数“exp”的参数太大 然后返回0 否则返回exp(值) 请帮助我如何处理此存储过程。发生的情况如下: regress=# SELECT exp(NUMERIC '6000'); ERROR: argument for function "exp" t

在PostgreSQL中,我得到一个错误:

ERROR: argument for function "exp" too big
SQL state: 22003
我需要为指数函数编写一个存储过程,如下所示:

  • 如果
    exp(value)
    抛出函数“exp”的参数太大
  • 然后返回0
  • 否则返回exp(值)

请帮助我如何处理此存储过程。

发生的情况如下:

regress=# SELECT exp(NUMERIC '6000');
ERROR:  argument for function "exp" too big
您正在将一个不切实际的大值传递给
exp()
。它太大了,无法溢出
float8
(双精度),只能表示为
数值。即使在那里,也有一个极限,当你超过
exp(5999)
时,你就会达到它

对于硬数学,您可能想试试,一种嵌入数据库的
R
语言

很难说该做什么,因为您还没有真正解释查询的目的,以及
exp
的输入应该是什么,等等

对于一个太大的指数,返回零有点疯狂。为什么?


要捕获异常,请在PL/PgSQL中使用

我编写了下面的函数来返回
NaN
(“不是一个数字”)而不是零,因为我认为返回零是完全错误的。如果你需要的话,可以改变它。返回
NULL
也可能有点意义

CREATE OR REPLACE FUNCTION exp_if_possible(numeric) RETURNS numeric as $$
BEGIN
    RETURN exp($1);
EXCEPTION
    WHEN numeric_value_out_of_range THEN
        RETURN 'NaN';
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
错误代码
数值超出范围
是通过查找Pg手册中超出范围
exp
中的
SQLSTATE 22003
获得的。您将在关于
BEGIN。。。异常


我最初说,如果要做的话,应该通过测试输入来完成,但我认为我错了。无法保证限制将是
exp(6000)
,因此使用异常处理是正确的,尽管它会非常缓慢和笨拙。我将在一秒钟内用异常处理版本更新此响应

CREATE OR REPLACE FUNCTION crazy_exp(numeric) RETURNS numeric AS $$
-- exp(6000) and above will throw 'argument for function "Exp" too big
-- For such cases, return zero because [insert explanation here]
SELECT CASE WHEN $1 < 6000 THEN exp($1) ELSE 0 END;
$$ LANGUAGE 'sql' IMMUTABLE;

CREATE OR REPLACE FUNCTION crazy_exp(float8) RETURNS float8 AS $$
-- float8 goes out-of-range above about exp(600)
SELECT CASE WHEN $1 <= 600 THEN exp($1) ELSE 0 END;
$$ LANGUAGE 'sql' IMMUTABLE;
CREATE或REPLACE FUNCTION\u exp(numeric)将数值返回为$$
--exp(6000)及以上将抛出函数“exp”的参数太大
--对于这种情况,返回零是因为[在此处插入解释]
选择$1<6000时的案例,然后选择exp($1),否则0结束;
$$语言“sql”不可变;
创建或替换函数crazy_exp(float8)将float8返回为$$
--浮点数8超出exp(600)以上的范围

选择$1时的CASE-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-WHEN-。但不要这样做。这种方法让人感觉非常错误,很痛苦。你到底为什么要这么做?你想解决的真正问题是什么?看起来你遇到了一个问题,你决定这就是解决方案,你在问如何创建你的解决方案。潜在的问题是什么?您试图解决的真正问题是什么?@Sathish感谢您删除您之前在这个问题上的努力。很好,但是上面的存储过程是疯狂的_exp(5999.2)?@Sathish。。。像你说的那样返回零。我不明白你最后的评论是什么意思。我还真的认为你应该编辑你的问题,并解释你为什么要这样做,这可能会有助于提出更干净/更好的解决方案。+1感谢包括你的Pg版本和清理你之前的问题。