我刚接触PostgreSQL。我有使用oracle的经验。在oracle中,为了找到确切的错误,我使用代码“dbms_output.put_line(sqlerrm)”。这里我有一个postgresql函数返回一个整数值
CREATE OR REPLACE FUNCTION public.fn_sqltest(
p_id integer)
RETURNS integer
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
Declare
n integer;
begin
select off_id into n from office
where per_id=p_id;
return n ;
exception when others then
return -1;
end;
$BODY$;
ALTER FUNCTION public.fn_sqltest(character varying)
OWNER TO postgres;
这个函数的名称如下
DO $$
DECLARE
ae integer;
BEGIN
ae:=fn_sqltest(10);
RAISE NOTICE 'exception: % % ', sqlstate , sqlerrm ;
RAISE NOTICE 'Return value is: % ', ae;
END $$;
我得到了错误
错误:列“sqlstate”不存在
我怎样才能像oracle中的sqlerrm一样显示准确的错误消息。
3条答案
按热度按时间gzjq41n41#
我更新了函数并在函数异常部分编写了代码
另一种方法是改变返回类型,我将返回类型改为text,并将异常部分代码重写如下
e0bqpujr2#
与PL/SQL不同,在PL/pgSQL中,SQLSTATE和SQLERRM不是在异常错误处理程序外部定义的。请参阅文档中的“获取有关错误的信息”一节。
这也意味着您不能获得成功操作的SQLSTATE和SQLERRM,这与PL/SQL不同。
因此,如果您想在异常处理程序之外使用这些特殊变量,就必须将它们存储在变量中。
我不知道你想如何从函数中返回它们,我可以在你的函数代码中演示这个想法:
fafcakar3#
我知道这很老套,但我还是要说:输出状态和错误消息的最简单方法是在exception子句中引发它们,不需要声明额外的变量。