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 |