2014-02-14 3 views
3

오류가 발생하면 어떻게 실행을 종료 할 수 있습니까? Microsoft SQL Server에는 작업을 수행하는 RETURN 절이 있습니다. 그러나 Oracle에서 비슷한 기능을 알고 싶습니다. Oracle Sql Developer를 사용하고 있습니다. 사용중인 스크립트는 다음과 같습니다.오류 발생시 실행 종료 PL/SQL

고유 키 위반으로 인해 첫 번째 블록에서 오류가 발생합니다. 오류가 발생하더라도 실행은 다음 블록으로 넘어 가서 insert 문을 실행합니다. 첫 번째 코드 블록에서 실행을 종료하거나 종료하고 싶습니다. 코드 작성을 도와주세요.

먼저 익명 PL/SQL 블록 :

set serveroutput on; 

BEGIN 
    insert into test values(1); 
    insert into test values(1); 
    COMMIT; 

    dbms_output.put_line('PRINT SOMETHING 1'); 

EXCEPTION 
    WHEN OTHERS THEN 
    if sqlcode <> 0 
    then 
     dbms_output.put_line(SQLCODE || ' ' || SQLERRM); 
     RAISE; 
    end if; 
    return; 
END; 
/

두 번째 익명 PL/SQL 블록 :

set serveroutput on; 

BEGIN 
    insert into test values(6); 
    COMMIT; 

    dbms_output.put_line('PRINT SOMETHING'); 

EXCEPTION 
    WHEN OTHERS THEN 
    if sqlcode <> 0 
    then 
     dbms_output.put_line(SQLCODE || ' ' || SQLERRM); 
     RAISE; 
    end if; 
    return; 
END; 
/

답변

3

하면 저장 프로 시저를 작성하는 경우, 당신은 더 많은 컨트롤을 가지고 당신이 언제든지 종료 할 수 있습니다 return 문.

그래서 저장된 프로 시저 작성 : SQLPLUS 또는 개발자에 다음

create or replace procedure myProc as 
begin 
    dbms_ouput.put_line('i am here'); 
    return; 
    dbms_ouput.put_line('and not here'); 
end; 

을 :

exec myProc(); 
1

당신은, "exit"를 사용할 수 있어야합니다 - 여기 Oracle 설명서 참조 : http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12023.htm

이 작업은 SqlPlus 세션을 종료하지만 단일 블록이나 저장 프로 시저를 사용하는 것 외에는 다른 방법이 있는지 알지 못합니다.

또 다른 유용한 구문은 다음과 같습니다

WHENEVER SQLERROR EXIT SQL.SQLCODE 

Oracle 설명서 : 여러분의 소중한 의견 http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12052.htm

0

감사합니다. JoshL, EXIT를 사용해 보았지만 오류가 발생했습니다. 제 코드를 수정하십시오 (PL/SQL을 처음 사용합니다). "WHEREEVER SQLERROR EXIT"는 사용하는 것이 좋지만 내 문제는 InstallShield에서 이러한 sql 스크립트를 사용하므로 InstallShield 설치 프로그램이 이러한 명령문을 인식하지 못하고 오류가 발생한다는 것입니다.

set serveroutput on; 

BEGIN 

insert into test values(1); 
insert into test values(1); 

COMMIT; 

    dbms_output.put_line('PRINT SOMETHING 1'); 

    EXCEPTION 
    WHEN OTHERS THEN 
    if sqlcode <> 0 
    then 
    dbms_output.put_line(SQLCODE || ' ' || SQLERRM); 
    RAISE; 
    exit; 
    end if; 

END; 
/
1

블록을 하나의 '프로그램 단위'로 중첩 할 수 있습니다. 이렇게하면 첫 번째 블록의 예외로 인해 첫 번째 블록으로 범위가 제한되지 않고 전체 프로그램 단위가 실행되지 않습니다.

set serveroutput on; 

BEGIN 
    BEGIN 
    insert into test values(1); 
    insert into test values(1); 
    COMMIT; 

    dbms_output.put_line('PRINT SOMETHING 1'); 

    EXCEPTION 
    WHEN OTHERS THEN 
     if sqlcode <> 0 
     then 
      dbms_output.put_line(SQLCODE || ' ' || SQLERRM); 
      RAISE; 
     end if; 
     return; 
    END; 
    BEGIN 
    insert into test values(6); 
    COMMIT; 

    dbms_output.put_line('PRINT SOMETHING'); 

    EXCEPTION 
    WHEN OTHERS THEN 
     if sqlcode <> 0 
     then 
      dbms_output.put_line(SQLCODE || ' ' || SQLERRM); 
      RAISE; 
     end if; 
     return; 
    END; 
END; 
/
관련 문제