LANGUAGE sql 中函数的 RAISE EXCEPTION 语句的等效或替代方法?

2024-01-18

对于下面编写的函数,RAISE EXCEPTION 语句是否有等效的(或解决方法)LANGUAGE sql?

CREATE OR REPLACE FUNCTION fn_interpolation (p_yearinteger integer, 
p_admin_id integer, p_crop_id integer, p_cropparameter integer)

RETURNS TABLE (value double precision, remark text)

AS $$

WITH

yearvalues AS (SELECT yearinteger, value FROM cropvalues WHERE crops_id = 
p_crop_id AND admin_id = p_admin_id AND parameter_id = p_cropparameter),

如果输入到函数中的参数不存在,我需要该函数中止并返回错误消息。例如IF parameter_id != p_cropparameter THEN RAISE EXCEPTION ‘invalid cropparameter’ END IF


只需定义一个简单的包装函数即可。

CREATE OR REPLACE FUNCTION raise_exception(text) RETURNS text AS $$
BEGIN
    RAISE EXCEPTION '%',$1;
END;
$$ LANGUAGE plpgsql VOLATILE;

然后使用CASE:

SELECT CASE 
         WHEN parameter_id != p_cropparameter 
           THEN raise_exception("blah") 
         ELSE parameter_id 
       END;

这仅在以下情况下有效CASE否则返回text不过,例如如果parameter_id是你得到的整数:

regress=> SELECT CASE WHEN 1 = 2 THEN raise_exception('blah') ELSE 1 END;
ERROR:  CASE types integer and text cannot be matched
LINE 1: SELECT CASE WHEN 1 = 2 THEN raise_exception('blah') ELSE 1 E...

您可以使用多态函数来解决这个问题。定义:

CREATE OR REPLACE FUNCTION raise_exception(anyelement, text) RETURNS anyelement AS $$
BEGIN
    RAISE EXCEPTION '%',$2;
    RETURN $1;
END;
$$ LANGUAGE plpgsql VOLATILE;

然后将 case 类型的假值传递给它,以便 PostgreSQL 正确地进行类型匹配,例如

SELECT CASE WHEN 1 = 1 THEN raise_exception(0, 'blah') ELSE 1 END;

or

SELECT CASE WHEN 1 = 1 THEN raise_exception(NULL::integer, 'blah') ELSE 1 END;

一切似乎都太难了?那是因为实际上,这种事情通常在 PL/PgSQL 中做得更好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LANGUAGE sql 中函数的 RAISE EXCEPTION 语句的等效或替代方法? 的相关文章

随机推荐