2012-03-27 2 views
1

PL/SQL 내에서 하나씩 실행되는 SQL (Select/Update/Insert) 구문이 하나씩 있습니다.PL/SQL 확인이 성공했는지 여부를 확인 하시겠습니까?

각 구문이 올바르게 완료되었는지 확인할 수있는 방법이 있으며 오류가 있으면 전체 PL/SQL을 중지 시키면 변수에 "OK"또는 "Not OK"를 반환하므로 IF와 함께 사용할 수 있습니까?

UPDATE

나는이 기능을 함께했다하지만하지 선량 작동하는 것 같다, 그것은 0을 반환 모든 시간!

create or replace 
FUNCTION EXECUTE_SQL(
     V_SQL IN VARCHAR2) 
    RETURN NUMBER 
    AS 
    V_RESULTS NUMBER := 1; 
    BEGIN 
    BEGIN 
     EXECUTE IMMEDIATE V_SQL; 
    EXCEPTION 
    WHEN OTHERS THEN 
     -- the following line is just for debugging! 
     dbms_output.put_line(SQLERRM); 
     V_RESULTS:= 0; 
    END; 
    RETURN V_RESULTS; 
    END EXECUTE_SQL; 

무엇이 잘못 되었습니까? 건배

+1

v_sql의 함수에 무엇을 전달합니까? 그리고 dbms_output.put_line은 무엇을 인쇄합니까? –

+3

경고 : 톰 키테 (Tae Kyte)는 'RAISE'가 없으면 'THEN'을 외칠 때 울음을 터뜨립니다. –

+0

@ René v_sql은 모든 SQL 구문이 될 수 있습니다! 및 dbms_output.put_line (SQLERRM); 그 기능이 깨져 있는지보기 위해서입니다! 일단 함수가 작동하면 삭제할 것입니다. –

답변

4
if sql%rowcount > 0 then 
    -- insert or update statement affected sql%rowcount rows 
end if; 

: 당신이, 당신이 할 수있는 예외를 일으킬 수있는 모든 문을 실행 하나에도 불구하고 싶다면

구문이 잘못된 경우, 심지어는하지 않습니다 엮다. 데이터 일관성 오류 (예 : 0으로 나누기 오류 또는 기본 키 위반)가 발생하면 예외가 발생합니다. 이러한 예외가 예외 핸들러에서 exception handlers

에서 잡은 될 수있다, 당신은 그 자세한 내용은 sqlerrm을 확인할 수 있습니다

begin 
    update t set x = ... 
exception when others then 
    dbms_output.put_line(SQLERRM); 
end; 

는 당신이 확인할 수 몇 predefined exceptions도 있습니다

begin 
      update t set x = ... 
exception 
    when DUP_VAL_ON_INDEX 
     -- primary key or unique key violation 
    when OTHERS 
     -- other kind of exception 
    end; 
+0

고마워, 내 대답을 기반으로 귀하의 답변을 업데이 트 희망, 당신이 나를 도울 수 있기를 바랍니다 –

+1

"구문이 잘못되면, 심지어 컴파일되지 않습니다"SQL은 즉각 실행에 의해 실행되고 그래서 그것은 체크되지 않습니다 컴파일 할 때. 유효하지 않은 sql을 함수에 전달하는 것은 완전히 가능합니다. –

+0

@Burhan Ali :이 글을 쓰던 당시 질문은 편집되지 않았고'execute immediate'에 대한 언급이 없었으며 * 구문 *은'execute immediate '를 통과하지 못한 "일반적인"SQL 문을 참조했습니다 '. 그래서 당시 그 발언은 완전히 정확했습니다. –

2

구문이 올바르지 않으면 전체 블록이 유효하지 않으므로 실행할 수 없습니다. 올바른 구문에 대해서는

BEGIN 

    BEGIN 
    statement1; 
    EXCEPTION 
    when exception1 then 
     some commands or null; 
    when exception2 then 
     some commands or null; 
    END; 

    BEGIN 
    statement2; 
    EXCEPTION 
    when exception3 then 
     some commands or null; 
    when exception4 then 
     some commands or null; 
    END; 

    etc. 
END; 
+0

좋은 대답이었습니다. 일을 더 쉽게하기 위해 여러 번 호출 할 수 있도록 함수를 만들었습니다. 내 업데이트 된 질문을 한번보세요!건배 –

0

쓰기

begin 
      update t set x = ... 
exception 
    when DUP_VAL_ON_INDEX 
     -- primary key or unique key violation 
    when OTHERS 
     -- other kind of exception 
    end; 
/
show errors 

오류가있는 경우 오류를 표시합니다.

+0

감사합니다. 업데이트 된 질문을 살펴보십시오. 건배 –

관련 문제