'proc'에 해당되는 글 11건

  1. 2007.07.13 [Pro*C]에러처리에 관하여(2)... by pino93 (1)
  2. 2007.07.13 [Pro*C] 에러처리에 관하여(1)... by pino93
  3. 2007.07.12 [Pro*C] ORA Error Message by pino93

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를 통한 직접적인 에러처리가 권장된다.


- oraclejava -

Posted by pino93
TAG error, proc

-----------
에러의 처리
-----------
모든 응용프로그램의 가장 중요한 부분중의 하나는 에러 처리가 될것이다. 특히 데이타베이스를  
사용하는 프로그램의 경우 서버가 유저 프로그램과는 별도로 동작하므로 서버와의 통신 및  
데이타베이스의 각종 상태를 이를 통하여 처리해야 함으로 매우 중요한 부분이라 하겠다.  
오라클의 PRE*Compiler를 사용하는 경우 에러처리란 SQL문장의 처리중 발생할수 있는 에러의  
감지및 이의 복구를 의미한다. 이장에서는 오라클의 PRE*Compiler를 사용하는 경우의 에러처리
방법을 알아보기로 하자.


1.1 에러 정보의 종류
오라클의 PRE*Compiler를 통해 얻을수 있는 에러정보는 SQLCA에 있는 변수를 통해서 가능하다.  
모든 SQL문이 수행될때마다 SQLCA에 SQLCODE로 모든 상태정보가 전달된다. 프로그램에서는  
WHENEVER를 이용하여 내부적으로 확인하거나 SQLCODE를 직접 참조하여 이를 확인할수 있다.  
'0'값이 전달되면 오라클이 SQL문장을 에러나 EXCEPTION('NO DATA FOUND', 'TOO MANY ROWS'등  
오라클이 내부적으로 정한 예외 사항 )없이 정상적으로 수행한것을 뜻하며 양수값이 전달되면  
오라클이 문장은 수행하였으나 EXCEPTION이 발생된것을 뜻한다. 만일 음수값이 전달되면 에러에  
의해 문장을 수행할수 없었음을 뜻한다. 이밖에도 SQLWARN으로 전달되는 경고메세지도 마찬가지
방법으로 참조할수 있으며 다중처리에서 설명된 추출된 로우의 총수를 알수있는 SQLERRD(3)도  
참조할수 있는 에러정보의 일종이다.

1.2 SQLCA의 사용
에러정보를 직접 다루어 에러처리를 하기 위해서는 SQLCA 영역의 정보를 사용해야만 한다.
이 방법을 이용할 경우는 매 SQL 수행후마다 에러처리를 해야만 하지만 그만큼 유연한 코딩이  
가능하다. SQLCA의 선언은 HEADER FILE의 INCLUDE만으로 가능하다.

EXEC SQL INCLUDE SQLCA;
이 소스코드는 GLOBAL지역에 선언되어 전코드에서 사용하도록 하고 SQLCA내에 저장되는 정보는
다음과 같다.
SQLCA
SQLCAID "SQLCA"라는 값
SQLCABC SQLCA 정보의 길이(bytes)
SQLCODE 오라클 에러메세지 코드
SQLERRM 에러메세지를 저장하기 위한 레코드
  SQLERRML 에러메세지의 길이
  SQLERRMC 에러메세지의 내용
SQLERRP
SQLERRD 6가지 상태코드 ARRAY
  SQLERRD(1)
  SQLERRD(2)
  SQLERRD(3) 수행된 로우수
  SQLERRD(4)
  SQLERRD(5) 파싱 에러 OFFSET
  SQLERRD(6)  
SQLWARN 8개의 경고(WARNING) ARRAY
  SQLWARN(1) 또다른 경고 FLAG
  SQLWARN(2) 잘려나간(Truncated) 문자열
  SQLWARN(3)  
  SQLWARN(4) SELECT 목록과 INTO 목록이 다름
  SQLWARN(5) WHERE절이 없는 UPDATE나 DELETE
  SQLWARN(6)  
  SQLWARN(7)
  SQLWARN(8)
SQLEXT  


- oraclejava -

'Program > Pro*c' 카테고리의 다른 글

[Pro*C] db에 image 저장하기  (0) 2007.08.18
[Pro*C] SendMail Function  (0) 2007.07.26
[Pro*C] 에러처리에 관하여(1)...  (0) 2007.07.13
[Pro*C]에러처리에 관하여(2)...  (1) 2007.07.13
[Pro*C] ORA Error Message  (0) 2007.07.12
[Pro*C] DB Connection  (0) 2007.06.15
Posted by pino93
1) Pro*C 에서 ORA-01405 에러 메시지
   - 원인 : 테이블의 특정 row 의 하나의 컬럼에 null 이 저장되어 있어서 Pro*C 로 select 할 때에 ORA-01405 에러를 반환
   - 해결방법 : 해당 컬럼에 nvl() 메소드를 이용하여서 NULL 인 경우에 대한 처리를 해 주어야 한다
Posted by pino93