在PL/pgSQL函数中,RAISE EXCEPTION 'mymessage' USING ...;将以“mymessage”作为错误消息,而在PL/ plpy.error('mymessage', ...)函数中,plpy.error('mymessage', ...)将以“plpy.Error:mymessage”作为错误消息。是否有一种直接的方法从错误消息中删除该前缀?
发布于 2019-11-06 13:18:48
恐怕你无论如何也改不掉。这是精心设计的。它有一点不同的语义。在plpgsql内部,您可以直接引发PostgreSQL异常。在Python中是不可能的-- plpy.Error的python异常被引发、捕获并转换为PostgreSQL异常-- "plpy.Error“是异常的名称。可以有任何其他异常的名称。
在本例中,Python异常的约定是- level: name: text。
你可以看到
ERROR: ZeroDivisionError: division by zero
ERROR: plpy.Error: some text也没有可能改变这种状况。这是故意的-这是惯例。
PLpgSQL没有这个约定--但PLpgSQL与Postgres的集成程度要高得多。它没有自己的环境,有自己的例外。
发布于 2020-10-27 17:19:02
如果您确实必须在异常消息中具有一致性,则可以将python函数封装在plpgsql函数中并编辑该消息。
CREATE OR REPLACE FUNCTION my_fn_py()
RETURNS VOID
LANGUAGE plpython3u VOLATILE
AS $python$
try:
# stuff... pretend this is a big complicated thing ...
except Exception as e:
plpy.error('custom_error', detail = str(e))
$python$;
-- Wrapper fn to normalize the plpython exceptions
CREATE OR REPLACE FUNCTION my_fn()
RETURNS VOID
LANGUAGE plpgsql VOLATILE
AS $body$
DECLARE
_msg TEXT;
_detail TEXT;
BEGIN
PERFORM my_fn_py();
EXCEPTION
WHEN OTHERS THEN
GET STACKED DIAGNOSTICS
_msg = MESSAGE_TEXT,
_detail = PG_EXCEPTION_DETAIL;
IF _msg = 'plpy.Error: custom_error' THEN
RAISE EXCEPTION 'custom_error' -- can't use a variable here :(
DETAIL := _detail,
ERRCODE := P0099;
ELSIF /* other cases... */ THEN
ELSE
-- Re-raise the original exception
RAISE;
END IF;
END
$body$;https://stackoverflow.com/questions/58720173
复制相似问题