PostgreSQL:postgres的oracle sqlerrm等效项

wb1gzix0  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(3)|浏览(476)

我刚接触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一样显示准确的错误消息。

gzjq41n4

gzjq41n41#

我更新了函数并在函数异常部分编写了代码

CREATE OR REPLACE FUNCTION public.fn_sqltest(
p_id integer)
RETURNS integer
LANGUAGE 'plpgsql'

COST 100
VOLATILE 

 AS $BODY$ 
 Declare
   n integer;
   text_var1 text;
   text_var2 text;
   text_var3 text;
 begin  

   select off_id into n from office 
     where per_id=p_id;

   return n ;

 exception when others then

   GET STACKED DIAGNOSTICS text_var1 = MESSAGE_TEXT,
                      text_var2 = PG_EXCEPTION_DETAIL,
                      text_var3 = PG_EXCEPTION_HINT;

   RAISE NOTICE 'Return value is: %  % %',text_var1 , text_var2, text_var3;

   return -1;

end;

$BODY$;

ALTER FUNCTION public.fn_sqltest(character varying)
OWNER TO postgres;

另一种方法是改变返回类型,我将返回类型改为text,并将异常部分代码重写如下

return sqlerrm;
e0bqpujr

e0bqpujr2#

与PL/SQL不同,在PL/pgSQL中,SQLSTATE和SQLERRM不是在异常错误处理程序外部定义的。请参阅文档中的“获取有关错误的信息”一节。
这也意味着您不能获得成功操作的SQLSTATE和SQLERRM,这与PL/SQL不同。
因此,如果您想在异常处理程序之外使用这些特殊变量,就必须将它们存储在变量中。
我不知道你想如何从函数中返回它们,我可以在你的函数代码中演示这个想法:

CREATE OR REPLACE FUNCTION public.fn_sqltest(
  p_id integer)
  RETURNS integer
  LANGUAGE 'plpgsql'

  COST 100
  VOLATILE 

 AS $BODY$ 
 Declare
   n integer;
   v_sqlerrm text;
   v_sqlstate text;
begin
 begin  

     select off_id into n from office 
       where per_id=p_id;

     return n ;

 exception when others then
    
     v_sqlerrm := sqlerrm;
     v_sqlstate := sqlstate;
      
 end;

 RAISE NOTICE 'exception: % %  ', v_sqlstate ,  v_sqlerrm ;

 return -1;

end;

 $BODY$;
fafcakar

fafcakar3#

我知道这很老套,但我还是要说:输出状态和错误消息的最简单方法是在exception子句中引发它们,不需要声明额外的变量。

CREATE OR REPLACE FUNCTION fn_sqltest(p_id integer)
    RETURNS integer
AS $$ 
DECLARE
    n   integer;
BEGIN
    SELECT off_id
        INTO n
        FROM office
        WHERE per_id = p_id;
    RETURN n;

EXCEPTION WHEN OTHERS THEN
    RAISE NOTICE 'exception: % - %', SQLSTATE, SQLERRM;
    RETURN -1;
END;
$$ LANGUAGE plpgsql;

相关问题