
[DECLARE 변수 선언] -- 추가 안 할수도 있음 BEGIN 실행문 END;
(문장이 끝날때 마다 ;(세미콜론) 붙이기)
DROP TABLE EMPLOYEES; CREATE TABLE EMPLOYEES AS ( SELECT * FROM HR.EMPLOYEES ); -- 기본키/외래키 제약 조건은 복사가 되지 않는다. ALTER TABLE EMPLOYEES ADD CONSTRAINT PK_EMP PRIMARY KEY(EMPLOYEE_ID);
SET SERVEROUTPUT ON; -- 디폴트가 OFF로 되어있음
DBMS_OUTPUT.PUT_LINE(출력할내용);
:=)-- 1. 스칼라 변수(직접 타입을 명시하는 방법) DECLARE NAME VARCHAR2(20 BYTE); AGE NUMBER(3); BEGIN NAME := 'tom'; AGE := 30; DBMS_OUTPUT.PUT_LINE('이름은 ' || NAME || '입니다.'); DBMS_OUTPUT.PUT_LINE('나이는 ' || AGE || '살입니다.'); END;
DECLARE EMPLOYEEID EMPLOYEES.EMPLOYEE_ID%TYPE; -- %TYPE 정해진 키워드 FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE; LASTNAME EMPLOYEES.LAST_NAME%TYPE; BEGIN SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME INTO EMPLOYEEID, FIRSTNAME, LASTNAME FROM EMPLOYEES WHERE EMPLOYEE_ID = 100; DBMS_OUTPUT.PUT_LINE(EMPLOYEEID || ', ' || FIRSTNAME || ', ' || LASTNAME); END;
IF 조건식1 THEN 실행문1 ELSIF 조건식2 THEN 실행문2 ... ELSE 실행문N END IF;
CASE WHEN 조건식1 THEN 실행문1 WHEN 조건식2 THEN 실행문2 ... ELSE -- ELSE는 생략 가능 실행문N END CASE;
WHILE 조건식 LOOP 실행문 END LOOP;
FOR 변수 IN 시작값..종료값 LOOP 실행문 END LOOP;
EXIT : 반복문(WHILE, FOR) 종료하기CONTINUE : 반복문의 시작부터 다시 실행하기 (무언가를 제외하고 싶을 때 사용)-- 1부터 누적하기. 누적 결과가 100을 넘어가면 그만 누적하고 출력하기
DECLARE
N NUMBER;
TOTAL NUMBER;
BEGIN
N := 1;
TOTAL := 0; -- 합계변수의 기본 초기값 : 0
-- 무한루프(끝내고 싶을 때 EXIT를 적어줌)
WHILE TRUE LOOP
IF TOTAL > 100 THEN
EXIT;
END IF;
TOTAL := TOTAL + N;
N := N + 1;
END LOOP;
-- 결과 확인
DBMS_OUTPUT.PUT_LINE(N || ', ' || TOTAL);
END;
-- 1부터 누적하기. 3의 배수는 제외하고 누적하기. 누적 결과가 100이 넘어가면 그만 누적하고 결과 출력하기
DECLARE
N NUMBER;
TOTAL NUMBER;
MODULAR NUMBER;
BEGIN
-- 초깃값
N := 0;
TOTAL := 0;
MODULAR := 0;
-- 무한루프
WHILE TRUE LOOP
-- N의 증가
N := N + 1;
-- 누적 결과가 100이 넘어가면 그만 누적하기
IF TOTAL > 100 THEN
EXIT;
END IF;
-- 3의 배수는 누적에서 제외하기
SELECT MOD(N, 3) INTO MODULAR -- 3으로 나눈 나머지를 MODULAR 변수에 저장
FROM DUAL;
IF MODULAR = 0 THEN
CONTINUE; -- WHILE TRUE LOOP문의 첫 실행문으로 되돌아가서 실행하시오.
END IF;
-- 누적
TOTAL := TOTAL + N;
END LOOP;
-- 결과확인
DBMS_OUTPUT.PUT_LINE(N || ', ' || TOTAL);
END;
EXCEPTION WHEN 예외종류1 THEN 예외처리1 WHEN 예외종류2 THEN 예외처리2 ... WHEN OTHERS THEN 예외처리N
-- 데이터를 찾지 못하는 경우의 예외 : NO_DATA_FOUND
DECLARE
EMPLOYEEID EMPLOYEES.EMPLOYEE_ID%TYPE;
FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
EMPLOYEEID := 0; -- 예외를 발생시키기 위해 일부러 만듬
SELECT FIRST_NAME INTO FIRSTNAME
FROM EMPLOYEES
WHERE EMPLOYEE_ID = EMPLOYEEID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(EMPLOYEEID || '번 사원은 없습니다.');
END;
-- 데이터가 너무 많은 경우 : TOO_MANY_ROWS
DECLARE
FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
SELECT FIRST_NAME INTO FIRSTNAME
FROM EMPLOYEES
WHERE EMPLOYEE_ID BETWEEN 100 AND 206;
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('결과가 너무 많다.');
END;
-- 모든 예외를 처리하는 방법 : OTHERS
DECLARE
FIRSTNAME EMPLOYEES.FIRST_NAME%TYPE;
BEGIN
SELECT FIRST_NAME INTO FIRSTNAME
FROM EMPLOYEES
WHERE EMPLOYEE_ID BETWEEN 100 AND 206;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLCODE); -- 예외코드 확인
DBMS_OUTPUT.PUT_LINE(SQLERRM); -- 예외메시지 확인
END;
✍️
BEGIN의 끝에서 COMMIT
EXCEPTION 에서 ROLLBACK
😊와,, 정말 재밌는데 짱 피곤하다👍👍