Oracle

[SQL]DAY.4

MoZZANG 2022. 3. 30. 14:30
FOR문

- 인덱스 카운터는 자동으로 선언된 변수

- FOR문은 1씩 밖에 증가 못한다.

- 항상 초기값이 종료값보다 작아야한다. 초기값이 더 크면 반복하지 않는다.

예]

FOR 인덱스 카운터 IN [REVERSE] 초기값 .. 종료값 LOOP
   statement1;
   statement2;
END LOOP;

 

 

 

 

▲ REVERSE는 끝값부터 시작값까지 역순으로 진행

 

 

PROMPT는 사용자로부터 입력을 받는 기능을 하는 함수다. 사용자로부터 값을 입력받아서 ACCEPT 뒤에 있는 변수명에 넣는다.

 

PL/SQL문 밖에서 선언된 변수를 PL/SQL문 안에서 사용할 때는 앞에 '&'를 반드시 붙여서 구분하도록 하자!

 

LOOP~ END LOOP; 시작부분과 끝부분을 의미하기 때문에 자바에서의  { } 처럼 사용되므로 꼭 열었으면 닫아줘야한다!

 

 

 

▲FOR문안에 IF문을 사용하여 코드를 만들 수도 있다.

 

 

 

 

DBMS_OUTPUT.PUT('줄바꿈 안하는 함수'); ->\r\n이 붙어야 출력된다.
DBMS_OUTPUT.NEW_LINE; (줄바꿈 하는 함수)

 

 

 

예제1)

 

▲위 배열형태를 출력하는 FOR문

 

 

 

예제2)

 

 

▲ 위 형태의 구구단을 출력하는 FOR문 코드

 

 

 

 

WHILE문
WHILE condition LOOP
   statement1;
   statement2;
END LOOP;

WHILE(condition){

}

 

 

예제1) 누적합

 

 

 

예제2)

▲위에서 FOR문으로 만들었언 1과 0으로 이루어진 배열을 WHILE문으로 만드는 방법

 

 

 

 

예제3)

▲ WHILE문으로 구구단 만드는 방법

 

 

 

 

 

LOOP문
LOOP
  statement1;
  statement2;
  EXIT  [WHEN condition];

END LOOP;

 

▲ LOOP문은 특정 조건으로 EXIT시키지 않으면 무한히 반복되는 무한루프문이다. 때문에 WHEN절과 같은 조건시에 EXIT해서 LOOP문을 빠져나올 수 있게 해야 한다.

 

 

▲ 사용자가 입력한 숫자까지의 누적합을 구하는 코드인데, 사용자가 입력한 숫자부터 0까지 1씩 감소하면서 누적합을 구한다. LOOP문에서 WHEN NUM=0; 이 되는순간 EXIT가 작동해서 LOOP문을 종료하고 빠져나와서 누적합값을 출력하게 된다.

 

 

 

 

 

 

SQL%FOUND, SQL%NOTFOUND, SQL%ROWCOUNT

 

 

  • SQL%FOUND : 가장 최근의 SQL문장이 하나 또는 그 이상의 행에 영향을 미쳤다면 TRUE반환
  • SQL%NOTFOUND : 가장 최근의 SQL문장이 하나 또는 그 이상의 행에 영향을 미치지 않았다면 TRUE반환
  • BUT 위 두 FOUND문은 출력문에는 사용불가하다
  • 예) DBMS_OUTPUT.PUT_LINE(SQL%FOUND); [X]
  • SQL%ROWCOUNT : 가장 최근의 SQL문장에 의해 영향을 받은 행의 수를 반환( 출력문에 사용 가능)
  • 여기서 말하는 SQL문장은 SELECT를 제외한 DELETE, UPDATE, INSERT를 의미한다.

 

▲ INSERT를 이용해 한 명의 정보를 BOARD테이블에 입력을 해주었기 때문에 1행이 영향을 받은 것이다.

따라서 SQL%FOUND는 TRUE를 반환하며 SQL%ROWCOUNT는 1을 반환할 것이다.

 

 

 

 

 

 

예외처리(EXCEPTION)

EXCEPTION : PL/SQL에서 발생하는 ERROR

ORACLE Server 에러가 발생하면 이와 관련된 EXCEPTION이 자동 발생한다.

 

예외처리 방법]
   
DECLARE 
    
BEGIN
  . . . 
    EXCEPTION
    WHEN exception명1 THEN      -- 정확한 에러명을 exception명 자리에 적어줘야 한다.
        statement1                       -- 해당 에러가 발생했을 때 출력할 출력문입력
    WHEN exception명2 THEN
        statement2
       . . . . . . . . . . . 
    WHEN OTHERS THEN            -- 위에 우리가 입력한 에러외의 에러가 발생했을 경우
        statement3
END;
/

 

1. PREDEFINED CXCEPTION

ORACLE SERVER에러중 자주 발생되는 20가지 에러에 대해 미리 정의되어 있는 EXCEPTION

EXCEPTION명 ERROR CODE ERROR 내용
NO_DATA_FOUND ORA-01403 데이터를 반환하지 않은 SELECT문
TOO_MANY_ROWS ORA-01422 두개 이상을 반환한 SELECT문
INVALID_CURSOR ORA-01001 잘못된 CURSOR 연산 발생
ZERO_DIVIDE ORA-01476 0으로 나누기
DUP_VAL_ON_INDEX ORA-00001 UNIQUE COLUMN에 중복된 값을 입력할 때
CURSOR_ALREADY_OPEN ORA-06511 이미 열려 있는 커서를 여는경우
INVALID_NUMBER ORA-01722 문자열을 숫자로 전환하지 못한 경우
PROGRAM_ERROR ORA-06501 PL/SQL 내부에 오류
STORAGE_ERROR ORA-06500 PL/SQL에 메모리 부족
VALUE_ERROR ORA-065502 산술,절단 등에서 크기가 다른 오류 발생

 

 

 

 

 

▲ 내가만든 MEMBER테이블의 구성내용

 

 

- PL/SQL문안에서 SELECT문을 쓸때는 반드시 INTO절과 함께 그리고 반드시 레코드 하나만 검색되는 SELECT문만 가능 

 

사용자에게 입력받은 아이디로 회원을 검색했을때 테이블에 해당 ID로 저장된 레코드가 없으면 NO_DATA_FOUND EXCEPTION이 발생하므로 마치 JAVA의 TRY~CATCH절 중 CATCH절과 같이 예외처리를 해줬다. 마지막에는 JAVA에서 EXCEPTION클래스 같은 기능을 하는 OTHERS를 이용해서 그 이외의 모든 에러시 에러번호와 해당 에러의 메세지를 출력하게 예외처리를 하였다.

 

 

 

 

2. NON-PREDEFINED EXCEPTION


- 사용자가 선언부에 EXCEPTION명을 정의하고 ORACLE Server에서 제공하는 error번호를 사용하여 Error와 연결한 후 예외처리부에서 Error처리해야한다.

 

▲ 숫자 10과 문자는 JAVA에서처럼 자동변환되어 연산될 수 없기 때문에 &AGE는 반드시 숫자만 입력받아야 한다. 만약 숫자가 아닌 것을 입력하게되면 INVALID_NUMBER 에러가 발생한다.

 

위 처럼 ORACLE에서 제공하는 예외명을 그대로 사용해서 예외처리를 할 수도 있지만 나만의 예외처리명을 만들 수도 있다. 바로 아래에서 나만의 예외처리를 만들어 보자.

 

▲ 우리가 위에서 알아본 INVALID_NUMBER에러를 MY_NOT_NUMBER라는 예외명으로 만들었다. 내가만든 예외명 뒤에는 반드시 EXCEPTION을 붙여서 선언해줘야 하고 PRAGMA EXCEPTION_INIT(내가만든 예외명, ORACLE에서 제공하는 ERRORCODE)을 이용하여 해당 예외명으로 예외를 초기화시켜줘야 한다. 

 

 

 

 

 

3. USER DEFINE EXCEPTION

: 사용자가 정한 조건이 만족되지 않을 때 ERROR를 발생

 

만약짝수를 입력하면 IF문의 조건이 TRUE가 되어 IF문안으로 들어간다. IF문안의 실행코드는 RAISE로 말 그대로 일으키다. 즉, EVEN_NOT_NUMBER라는 사용자가 만든 예외를 발생시킨다. RAISE가 실행되면 해당 예외가 처리되는 곳으로 이동하게 되며 위 코드에서는 IF문이 종료되어 EXCEPTION부분으로 들어가서 '짝수는 안되요'가 실행될 것이다.

'Oracle' 카테고리의 다른 글

[SQL]SQL -Day. 6  (0) 2022.04.01
[SQL]SQL -Day. 5  (0) 2022.03.31
[SQL]SQL -Day.3  (0) 2022.03.29
[SQL]SQL -Day.2  (0) 2022.03.28
[SQL]SQL -Day.1  (0) 2022.03.27