postgreSQL:相当于sqrerm的oracle sqlerrm

时间:2019-07-18 07:23:52

标签: postgresql

我是PostgreSQL的新手。我在甲骨文公司有经验。在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。

1 个答案:

答案 0 :(得分:0)

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

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;

另一种方法是通过更改返回类型。我将返回类型更改为文本,并重写了如下的异常部分代码

return sqlerrm;