2014년 9월 22일 월요일

Pro*C에서의 에러처리에 관하여(2)... [오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

----------- 
에러의 처리 
----------- 
1.3 WHENEVER의 사용 
PRE*Compiler를 이용하여 만들어진 프로그램은 디폴트로 오라클의 에러와 경고를 무시하고 
처리를 계속한다. 그러므로 자동적인 조건검색이나 에러처리를 위해서는 WHENEVER를 사용하여야 
한다. WHENEVER문과 함께 오라클이 에러나 경고가 발생하거나  'NOT FOUND'가 발생할때 어떤 
처리과정을 수행하도록 할수 있다. 이 처리과정은 다음으로 계속 처리를 수행하거나 특정한 
루틴을 콜하거나 특정한곳으로 'GOTO'하거나 처리를 정지하는 것등이다. 사용문법은 다음과 같다. 

EXEC SQL WHENEVER <조건> <처리>; 
이렇게 선언된 WHENEVER는 프로그램 소스코드에서 영향을 미치는 범위(SCOPE)는 논리적이 
아니라 위치적이라는 것을 명심하여야 한다. 그러므로, 로직처리에 의한 순서가 아니라 소스 
코드내의 선언된 위치에 의하여 다음 WHENEVER가 선언되기 전까지는 무조건 SQL문장에 같은 
효과를 미친다. 그러므로, WHENEVER의 사용은 매우 주의를 요하며 전 프로그램내에서 공통적으로 
사용될 에러처리에만 WHENEVER를 사용해야 한다. SQLCODE가 음수값을 갖는 에러같은 경우에 
이의 적용이 유리하다.오라클은 WHENEVER에서 선언된 조건에 맞게 자동적으로 SQLCA영역의 
정보를 검색하며 조건은 다음과 같다. 

 SQLWARNING 
오라클이 SQL문장을 수행한후 경고가 발생하여 SQLWARN ARRAY가 'W'로 SET된 경우이다. 
또한, SQLCODE가 '1403'을 제외한 나머지 양수 값인 경우도 이조건에 해당되어 해당 처리가 
수행된다. 

 SQLERROR 
오라클이 SQL문장을 수행한후 에러가 발생하여 SQLCODE가 음수값을 갖는 경우로 해당 처리가 
수행된다. 

 NOT FOUND 
오라클이 SQL문장을 수행하면서 더이상의 추출될 로우가 없거나 'SELECT INTO'문의 경우 추출될 
로우가 없는 경우 SQLCODE는 1403의 값을 가지며 이경우 해당 처리가 수행된다. 

오라클이 위의 조건을 만나면 수행될 처리에 다음과 같은 명령어를 사용할수 있다. 
 CONTINUE 
프로그램은 해당조건이 발생했더라도 다음으로 계속 처리된다. 
 DO <루틴명> 
해당 조건이 발생하면 선언된 루틴으로 제어가 옮겨진다. 즉, 프로그램내에 코딩된 해당 루틴을 
콜하게 된다. 이것은 SQLERROR 조건과 같이 사용하여 에러 내용을 화면에 출력하고 프로그램을 
종료시키는 등의 루틴을 콜한다면 매우 유용하게 사용할수 있다. 

EXEC SQL WHENEVER SQLERROR DO sqlerror(); 

void sqlerror() 

if ( sqlca.sqlcode == -1405 ) { /* NULL값을 갖는 column의 fetch */ 
 
} else if ( sqlca.sqlcode == -1406 ) { /* Fetch column truncated */ 
 
} else { 
  printf("\n오라클 Error: % .70s\n", sqlca.sqlerrm.sqlerrmc); 
  EXEC SQL ROLLBACK WORK RELEASE; 
  exit(1); 


 GOTO 
해당조건이 발생되면 해당 레이블로 제어가 옮겨진다. 그러나, WHENEVER의 지정은 프로그램 
코드내에서 다음 같은 조건의 WHENEVER가 나올때 까지 모든 SQL문에 대해 자동적으로 같이 
지정되므로 일반적으로 여러개의 서브루틴으로 코딩하는 경우 언어의 문법적 오류를 일으키기 
마련이다. 그러므로, 가급적이면 GOTO를 사용하여 코딩하는 일은 없어야 하며 구조적인 3세대 
언어를 구사하는데 있어서도 GOTO문은 좋지 않은 프로그램 소스가 될것이다. 
 STOP 
커밋되지 않은 트랜잭션은 롤백되고 프로그램은 종료된다. 이경우 프로그램이 바로 종료되므로 
어떠한 에러메세지도 화면에 표시할수 없으므로 사용에 주의를 요한다. 
위에 설명한 바와 같이 WHENEVER의 사용은 SQLERROR DO <루틴명> 이외의 다른 조건들과 
처리부분들이 사용의 효과가 그다지 크지 않으며 오히려 영향을 미치는 범위가 위치 선언적이므로 
자칫 잘못사용하면 혼란만 가중되므로 SQLCODE를 통한 직접적인 에러처리가 권장된다. 


 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-271961
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111440
53 [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… 오라클자바…03-151197
52 [주말주간]C#, ASP.NET마스터 오라클자바…01-311359
51 [평일,기업100%환급]SQL기초에서 Schema Object까지 오라클자바…01-311139
50 [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 오라클자바…01-311046
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191359
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-111192
47 [평일야간,주말주간]JAVA,Network&JSP&Spring,MyBatis,Hibernate 오라클자바…01-031696
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-271961
45 [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… 오라클자바…12-191462
44 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) 오라클자바…12-141428
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111440
42 [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-091158
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011354
40 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… 오라클자바…12-011519
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011021

댓글 없음:

댓글 쓰기