int*_*ost 0 postgresql postgresql-9.3
下面写的函数的 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),
Run Code Online (Sandbox Code Playgroud)
如果输入到函数中的参数不存在,我需要该函数中止并返回错误消息。例如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;
Run Code Online (Sandbox Code Playgroud)
然后使用CASE:
SELECT CASE
WHEN parameter_id != p_cropparameter
THEN raise_exception("blah")
ELSE parameter_id
END;
Run Code Online (Sandbox Code Playgroud)
这仅在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...
Run Code Online (Sandbox Code Playgroud)
您可以使用多态函数通过 hack 来解决此问题。定义:
CREATE OR REPLACE FUNCTION raise_exception(anyelement, text) RETURNS anyelement AS $$
BEGIN
RAISE EXCEPTION '%',$2;
RETURN $1;
END;
$$ LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)
然后将 case 类型的假值传递给它,以便 PostgreSQL 正确类型匹配它,例如
SELECT CASE WHEN 1 = 1 THEN raise_exception(0, 'blah') ELSE 1 END;
Run Code Online (Sandbox Code Playgroud)
或者
SELECT CASE WHEN 1 = 1 THEN raise_exception(NULL::integer, 'blah') ELSE 1 END;
Run Code Online (Sandbox Code Playgroud)
一切似乎都太难了?那是因为实际上,这种事情通常在 PL/PgSQL 中做得更好。
| 归档时间: |
|
| 查看次数: |
712 次 |
| 最近记录: |