2016-08-08 4 views
0

I는 테이블 3 개 기능을 가질 fntrans-calls-> fntrans2-calls->이 예에서PostgreSQL : 함수에서 예외를 잡는 방법?

fntrans3 I는 fntrans3의 호출을 제거한();

SELECT public.fntrans2(); 

테이블 T2가 레코드를 포함이 호출, 확인, 그것은 분명 후

는, 롤백 기능

의 내부 세이브 포인트로 작동하지만 SELECT public.fntrans를 호출 할 때() ;

테이블에 행이없고 출력에 fntrans의 예외에 대한 알림이 표시됩니다.

제 2의 경우 예외가 제 1 함수에 던져졌지만 fntrans2 만 호출하면이 함수 내부에서 예외가 발생합니다.

create table t2(ID SERIAL PRIMARY KEY, f1 INTeger); 

CREATE OR REPLACE FUNCTION "public"."fntrans" (
) 
RETURNS integer AS 
$body$ 
declare d double precision; 
BEGIN 
raise notice 'fntrans'; 
    INSERT INTO t2 (f1) VALUES (1); 
    INSERT INTO t2 (f1) VALUES (2); 
    INSERT INTO t2 (f1) VALUES (3); 
    select fntrans2(); 
    INSERT INTO t2 (f1) VALUES (4); 
    RETURN 1; 
EXCEPTION 
    WHEN OTHERS THEN 
    BEGIN 
    raise notice 'fntrans exception'; 
    RETURN 0; 
    END; 
END; 
$body$ 
LANGUAGE 'plpgsql' 
VOLATILE 
CALLED ON NULL INPUT 
SECURITY INVOKER 
COST 100; 


CREATE OR REPLACE FUNCTION public.fntrans2 (
) 
RETURNS integer AS 
$body$ 
declare d double precision; 
BEGIN 
    raise notice 'fntrans2'; 
    INSERT INTO t2 (f1) VALUES (10); 
    INSERT INTO t2 (f1) VALUES (22); 
    INSERT INTO t2 (f1) VALUES (30); 

    BEGIN 
      raise exception 'Oooooppsss 2!'; 
      INSERT INTO t2 (f1) VALUES (40); 
      RETURN 1; 
    EXCEPTION 
    WHEN OTHERS THEN RETURN 0; 
    END; 
END; 
$body$ 
LANGUAGE 'plpgsql' VOLATILE; 


CREATE OR REPLACE FUNCTION public.fntrans3 (
) 
RETURNS integer AS 
$body$ 
declare d double precision; 
BEGIN 
    raise notice 'fntrans3'; 

    INSERT INTO t2 (f1) VALUES (100); 
    INSERT INTO t2 (f1) VALUES (200); 
    INSERT INTO t2 (f1) VALUES (300); 
    raise exception 'Oooooppsss 3!'; 
    INSERT INTO t2 (f1) VALUES (400); 
    RETURN 1; 
EXCEPTION 
    WHEN OTHERS THEN RETURN 0; 
END; 
$body$ 
LANGUAGE 'plpgsql' 
VOLATILE 
CALLED ON NULL INPUT 
SECURITY INVOKER 
COST 100; 

답변

1

귀하의 문제는 fntrans의 라인

select fntrans2(); 

입니다. PL/pgSQL에 INTO 절이없는 SELECT 절을 사용할 수 없습니다. 별다른 설명이다

CONTEXT: SQL statement "select fntrans2()" 
PL/pgSQL function fntrans() line 8 at SQL statement 
ERROR: query has no destination for result data 
HINT: If you want to discard the results of a SELECT, use PERFORM instead. 
CONTEXT: PL/pgSQL function fntrans() line 8 at SQL statement 

다음 EXCEPTION없이

는 다음과 같은 메시지가 나타납니다 차단합니다.
또한 함수 fntrans2 –의 결과가 표시되지 않는 이유를 설명합니다.

당신은,이 2 개 가지 예외, 당신 말이 맞아,

PERFORM fntrans2(); 
+0

예에 thnx를 일으키는 라인을 변경할 수 있습니다! – Oleg