익명 블록 : 한번만 실행

선언부(DECLARE) : 모든 변수나 상수 선언

실행부(BEGIN) : 제어문, 반복문, 함수 정의 등의 로직 구현, END로 끝남, 필수블록

예외처리부(EXCEPTION) : 에러발생을 대비한 예외처리

- SET SERVEROUTPUT ON : PL/SQL 실행 결과를 화면에 출력하기 위해서 환경변수를 활성화 시켜줘야함

SET SERVEROUTPUT ON;  -- PL/SQL 결과 화면 출력기능 활성화

[DECLARE
    선언부]
BEGIN
    실행부
    [EXCEPTION 예외처리부]
END;

DECLARE
    v_number NUMBER(4);
    v_name   VARCHAR2(10);
    v_tax    CONSTANT NUMBER(2) := 4;		-- 상수 할당
    v_deptno NUMBER(3) DEFAULT 100;		-- 기본값
    v_allno  NUMBER(2) NOT NULL DEFAULT	10	-- NOT NULL, 기본값
BEGIN
    v_number := 5;
    DBMS_OUTPUT.PUT_LINE('v_number : ' ||  v_number);
END;
/

자료형

 - 스칼라형 : 기본타입(NUMBER, VARCHAR2, DATE, BOOLEAN 등)

 - 참조형 : 존재하는 테이블에서 자료형 가져오기 (%TYPE : 열 자료형, %ROWTYPE : 행 자료형)

DECLARE
  vno emp.empno%TYPE;
  vname emp.ename%TYPE;
  vsal  emp.sal%TYPE;
BEGIN
  SELECT empno, ename, sal INTO vno, vname, vsal	-- INTO : 변수에 컬럼 넣기
  FROM emp
  WHERE empno = 7900;
  
  dbms_output.put_line(vno || ' ' || vname || ' '|| vsal);
END;
DECLARE
  v_row emp%ROWTYPE;
BEGIN
  SELECT * INTO v_row 
  FROM emp
  WHERE empno = 7900;
  
  dbms_output.put_line(v_row.empno || ' ' || v_row.ename || ' '|| v_row.sal);
END;

 - 복합형 : 여러 종류 및 갯수의 데이터가 담긴 사용자 정의 자료형

레코드 : 자료형이 다른 데이터 저장 (like 자바의 클래스)

DECLARE
    TYPE 레코드명 IS RECORD(
        no   NUMBER(2),
        name VARCHAR2(10)
    );
    v_변수 레코드명;		-- 레코드의 변수선언
BEGIN
    no := 10;
    DBMS_OUTPUT.PUT_line('no : ' || v_변수.no);
END;

컬렉션 : 자료형이 같은 데이터 저장(테이블 타입) (like 배열)

DECLARE
    t_name  VARCHAR2(20);
  
    TYPE 컬렉션명 IS TABLE OF 자료형
    INDEX BY 인덱스형;
  
    v_변수 컬렉션명;		-- 컬렉션의 변수선언
BEGIN
    SELECT ename INTO t_name
    FROM emp
    WHERE empno = 7499;
  
    v_변수(0) := t_name;
    dbms_output.put_line(v_변수(0));
END;

○ 조건문 : IF-ELSIF-ELSE, CASE

IF (v_sal >= 5000) THEN
    v_tax := v_sal*0.05;
ELSIF (v_sal BETWEEN 4000 AND 4999) THEN
    v_tax := v_sal*0.04;
ELSIF (v_sal BETWEEN 3000 AND 3999) THEN
    v_tax := v_sal*0.03;
ELSIF (v_sal BETWEEN 2000 AND 2999) THEN
    v_tax := v_sal*0.02;
ELSE
    v_tax := v_sal*0.01;
END IF;

○ 반복문 : 기본루프, FOR, WHILE

DECLARE
  num NUMBER := 0;
BEGIN 
  loop
    dbms_output.put_line(num);
    num := num +1;
    exit WHEN num > 5;
  END loop;
END;
BEGIN
  FOR i IN [REVERSE] 0..5 loop			-- 0 <= i <= 5
    dbms_output.put_line(i);
    CONTINUE WHEN i >10;
  END loop;
END;
DECLARE
  num NUMBER := 0;
BEGIN
  WHILE (num < 6) loop
    dbms_output.put_line(num);
    num := num +1;
  END loop;
END;

○ 예외처리 : 예외명, 예외번호를 알아야 처리, 생성 가능

DECLARE ~생략~
BEGIN ~생략~
EXCEPTION
  WHEN 예외명1 THEN
     dbms_output.put_line('SQLCODE : ' || SQLCODE);		-- 오류번호
     dbms_output.put_line('SQLERRM : ' || SQLERRM);		-- 오류메시지
  WHEN 예외명2 THEN
     dbms_output.put_line('SQLCODE : ' || SQLCODE);
     dbms_output.put_line('SQLERRM : ' || SQLERRM);
END;
-- 사용자 정의 예외처리 --
DECLARE
  new_msg exception;				-- 예외명 : new_msg
  pragma exception_init(new_msg, -1);		-- pragma exception_init(예외명, 예외코드)
BEGIN
  INSERT INTO t_pragma VALUES (1, 'CCC');
exception
  WHEN new_msg THEN
    dbms_output.put_line('존재하는 번호입니다.');
END;

- 예외처리 발생시키기 : raise 키워드  or raise_application_error(에러코드, 에러메시지) 사용

   -> raise_application_error : 사용자 에러코드 함수로써 에러코드범위는 -20000 ~ -20999

DECLARE
  v_empno emp.empno%TYPE;
  v_name emp.ename%TYPE;
  no_empno  exception;			-- exception 선언
BEGIN
  DELETE FROM emp WHERE empno = &empno;
  
  IF SQL%notfound THEN
    RAISE no_empno;			-- exception 발생
--  raise_application_error(-20100, '사원이 없습니다.');
  END IF;
exception
  WHEN no_empno THEN			-- exception 처리
    dbms_output.put_line('사원이 없습니다.');
END;

저장 서브프로그램 : 이름 지정해서 저장 후 호출

 - 프로시저, 트리거, 사용자 정의 함수, 패키지

  프로시저 함수
실행 EXEC 명렁어, PL/SQL 내
(SQL문에서는 사용 X)
PL/SQL 내
(SQL문에서 사용 O)
파라미터 IN, OUT, IN OUT (3개) IN (1개) - 생략가능
반환값 0~여러개(OUT 모드) 오직 1개(RETURN문)

● 에러 확인

SHOW ERRORS;