일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- Java
- 공부를열심히
- 코딩
- 웹프로그래밍
- 웹
- DB
- 주말이다..
- 데이터베이스
- Project
- CSS
- 자바
- 오라클
- html
- javascript
- ERWin
- sql
- squery
- 프로그래밍
- jsp
- 공부
- web
- orcle
- UI
- 객체지향프로그래밍
- Oracle
- 객제지향프로그래밍
- 객체지향
- 프로젝트
- 객제지향
- 테이블
- Today
- Total
햄찌개
ORACLE 공부 11일차 2020/08/31 본문
2020-08-31-01)
1. IF문
- 다른 응용 프로그램언어의 IF문과 같은 기능
(사용형식)
IF 조건 THEN
명령1;
[ELSE
명령 2;]
END IF;
(나열식 IF)
IF 조건1 THEN
명령1;
ELSE 조건2 THEN
명령2;
ELSIF 조건3 THEN
명령3;
ELSE
명령4;
END IF;
(중첩 IF)
IF 조건1 THEN
IF 조건2 THEN
명령1;
ELSE
명령2;
END IF;
ELSE
명령3;
END IF;
예) 임의의 부서코드(10~110)를 하난 생성하여 해당부서에 속한 사원 정보를 조회하고
첫번째 검색된 사원의 급여가
3000미만이면 '낮은임금',
3000~6000 이면 '중간임금'
그 이상이면 '높은임금'을 출력하시오.
출력할 데이터는 사원명, 부서명, 급여, 비고이다.
DECLARE --변수 선언부
V_NAME EMPLOYEES.EMP_NAME%TYPE;
V_DEPT_NAME DEPARTMENTS.DEPARTMENT_NAME%TYPE;
V_SAL EMPLOYEES.SALARY%TYPE;
V_REMAK VARCHAR2(50);
V_DEPT_ID DEPARTMENTS.DEPARTMENT_ID%TYPE;
BEGIN
V_DEPT_ID := ROUND(DBMS_RANDOM.VALUE(10,110),-1); --10부터 100사이에 있는 정수형 난수 발생 ,-1해서 일의자리는 전부 0
SELECT A.EMP_NAME, B.DEPARTMENT_NAME, A.SALARY INTO V_NAME, V_DEPT_NAME, V_SAL --INTO : 변수에 넘겨주는 것
FROM EMPLOYEES A, DEPARTMENTS B
WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
AND A.DEPARTMENT_ID = V_DEPT_ID
AND ROWNUM =1;
IF V_SAL BETWEEN 1 AND 2999 THEN
V_REMAK :='낮은임금';
ELSIF V_SAL BETWEEN 3000 AND 6000 THEN
V_REMAK :='보통임금';
ELSE
V_REMAK :='높은임금';
END IF;
DBMS_OUTPUT.PUT_LINE(V_NAME||', '||V_DEPT_NAME ||', '||V_SAL|| '=>'||V_REMAK);
END;
2020-08-31-02)
반복문
- PL/SQL의 반복문에는 LOOP, WHILE, FOR문이 제동
1)LOOP문
- 반복문의 기본구조
(사용형식)
LOOP
반복처리문;
EXIT WHEN 조건; --조건이 맞으면 빠져나간다 JAVA의 break와 비슷
END LOOP;
- '조건'이 참(TRUE)이면 반복을 벗어난다.
예) 단을 입력받아 해당 구구단 출력 ( LOOP문 이용)
ACCEPT P_BASE PROMPT '단 (2~9) 입력 : '
DECLARE
V_BASE NUMBER := TO_NUMBER('&P_BASE');
V_CNT NUMBER := 1;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE(V_BASE || ' * '||V_CNT||' = '||V_BASE*V_CNT);
EXIT WHEN V_CNT =9;
V_CNT := V_CNT+1;
END LOOP;
END;
예) 회원테이블에서 마일리지가 4000이상인 회원의 이름, 직업, 마일리지를 구하는 커서를
생성하고 커서결과를 처리할 때 성별을 구별하여 '여성회원', '남성회원'을 출력하시오
DECLARE
V_NAME MEMBER.MEM_NAME%TYPE;
V_JOB MEMBER.MEM_JOB%TYPE;
V_MILE MEMBER.MEM_MILEAGE%TYPE;
V_GENDER VARCHAR2(30);
V_ID CHAR(1);
CURSOR CUR_MEM2 IS
SELECT MEM_NAME, MEM_JOB, MEM_MILEAGE
FROM MEMBER
WHERE MEM_MILEAGE >= 3000;
BEGIN
OPEN CUR_MEM2;
LOOP
FETCH CUR_MEM2 INTO V_NAME, V_JOB, V_MILE;
EXIT WHEN CUR_MEM2%NOTFOUND;
SELECT SUBSTR(MEM_REGNO2,1,1) INTO V_ID
FROM MEMBER
WHERE MEM_NAME = V_NAME;
IF V_ID = '1' OR V_ID = '3' THEN
V_GENDER := '남성회원';
ELSE
V_GENDER := '여성회원';
END IF;
DBMS_OUTPUT.PUT_LINE('회원명 : '||V_NAME);
DBMS_OUTPUT.PUT_LINE('성별 : '||V_GENDER);
DBMS_OUTPUT.PUT_LINE('직업 : '||V_JOB);
DBMS_OUTPUT.PUT_LINE('마일리지 : '||V_MILE);
DBMS_OUTPUT.PUT_LINE('----------------------------');
END LOOP;
DBMS_OUTPUT.PUT_LINE('회원수 : '||CUR_MEM2%ROWCOUNT);
CLOSE CUR_MEM2;
END;
2) WHILE 문
- 다른 애플리케이션 개발언어의 WHILE문과 같은 기능 제공
(사용형식)
WHILE 조건
LOOP
반복처리문;
END LOOP;
- 조건이 참(true)이면 반복 수행하고 거짓(false)이면 반복문을 벗어난다.
예) 구구단 7단 출력
DECLARE
V_CNT NUMBER :=0;
V_RESULT VARCHAR2(50);
BEGIN
WHILE V_CNT < 9 LOOP
V_CNT:=V_CNT+1;
V_RESULT :='7 * ' ||V_CNT||'='|| V_CNT*7;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END LOOP;
END;
3-1. 일반 FOR문
-다른 애플리케이션 개발언어의 FOR문의 역할
(사용형식)
FOR 인덱스 IN (REVERSE) 초기값..최종값
LOOP
반복처리문;
END LOOP;
- 인덱스는 선언하지 않아도 된다.
예) 구구단 7단을 출력
DECLARE
V_BASE NUMBER :=7;
V_RESULT VARCHAR2(30);
BEGIN
FOR I IN 1..9 LOOP
V_RESULT := V_BASE||' * '||I||' = '||V_BASE*I;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END LOOP;
END;
3-2. CURSOR를 사용한 FOR 문
(사용형식)
FOR 레코드명 IN 커서명 LOOP
커서 처리문;
END LOOP;
- 커서의 OPEN, FETCH, CLOSE문을 생략
- 커서의 컬럼명은 '레코드명.컬럼명'으로 참조
- 레코드명은 시스템에서 제공 (선언이 불필요)
'Oracle' 카테고리의 다른 글
ORACLE 공부 13일차 2020/09/02-(1) (0) | 2020.09.02 |
---|---|
ORACLE 공부 12일차 2020/09/01 (1) | 2020.09.01 |
ORACLE 공부 10일차 2020/08/27~28 (0) | 2020.08.28 |
ORACLE 공부 9일차 2020/08/24 (0) | 2020.08.28 |
ORACLE 공부 8일차 2020/08/17~18 (0) | 2020.08.28 |