기본 구조
1) 선언부(declare) : 모든 변수나 상수를 선언하는 부분
2) 실행부(executable - begin)
3) 예외처리부(exception)
※ 위 기본 구조 중에서 선언부와 예외처리부는 생략이 가능하지만 실행부는 반드시 존재해야 함
화면에 출력 기능을 활성화를 시켜 주어야 한다 ( 기본적으로 off ) -- 한번만 키면 종료할 때까지 사용 가능
set serveroutput on;
-- "Hello PL/SQL" 이라는 문장을 PL/SQL을 이용하여 화면에 출력해 보자
begin
-- 화면(콘솔)에 문장을 출력하는 명령문
dbms_output.put_line('Hello PL/SOL');
end;
/
-- /가 없으면 다음 명령문을 만들 때 같이 실행됨
set serveroutput on; 을 하지 않고 실행할 경우 출력이 되지 않는다
set serveroutput on; 을 먼저 해주고 실행하면 출력이 됨
선언부(declare) 영역에 변수를 선언하는 방법
1) 스칼라 자료형
declare
v_empno number(4) := 7788;
v_ename varchar2(30);
begin
v_ename := 'ADAMS';
dbms_output.put_line('v_empno >>> ' || v_empno);
dbms_output.put_line('v_ename >>> ' || v_ename);
end;
/

2) 레퍼런스 자료형
테이블에 정의된 컬럼의 자료형과 크기를 모두 파악하고 있다면 문제가 없겠지만,
대부분은 그렇지 못하기 때문에 오라클에서는 래퍼런스(reference) 변수를 제공해 줌
declare
e_empno emp.empno%TYPE;
e_ename emp.ename%TYPE;
begin
e_empno := 7900;
e_ename := 'SCOTT';
dbms_output.put_line('e_empno >>> ' || e_empno);
dbms_output.put_line('e_ename >>> ' || e_ename);
end;
/

3) rowtype 자료형
테이블의 모든 컬럼을 한꺼번에 저장하기 위한 변수로 선언하는 방법
declare
emp_row emp%rowtype;
begin
select * into emp_row
from emp
where empno = 7698;
dbms_output.put_line(emp_row.empno ||' '|| emp_row.ename
||' '|| emp_row.job || ' '|| emp_row.mgr
||' '|| emp_row.hiredate ||' '|| emp_row.sal
||' '|| emp_row.comm ||' ' || emp_row.deptno);
end;
/

declare
dept_row dept%rowtype;
begin
select * into dept_row
from dept
where deptno = 30;
dbms_output.put_line(dept_row.deptno||' '||dept_row.dname||' '||dept_row.loc);
end;
/

1. if 조건문
1) if ~ then 조건문
if 조건식 then
조건식이 참인 경우 실행 문장;
end if;
2) if ~ then ~ else 조건문
if 조건식 then
조건식이 참인 경우 실행 문장;
else
조건식이 거짓인 경우 실행 문장;
end if;
3) if ~ then ~ elsif 조건문
if 조건식1 then
조건식1이 참인 경우 실행 문장;
elsif 조건식2 then
조건식1이 거짓이고, 조건식2가 참인 경우 실행 문장;
elsif 조건식3 then
조건식1, 조건식2가 거짓이고, 조건식3이 참인 경우 실행 문장;
else
조건식1, 조건식2, 조건식3 모두가 거짓인 경우 실행 문장;
end if;
if ~ then 조건문
DECLARE
e_number number := 77;
begin
if e_number >= 50 then
dbms_output.put_line(e_number||'은(는) 50보다 큰 수 입니다.');
end if;
end;
/

if ~ then ~ else 조건문
DECLARE
e_num number := 86 ;
begin
if mod(e_num,2) = 0 then
dbms_output.put_line(e_num||'은(는) 짝수입니다');
else
dbms_output.put_line(e_num||'은(는) 홀수입니다');
end if;
end;
/

if ~ then ~ elsif 조건문
DECLARE
e_avg number := 88.12;
BEGIN
if e_avg >= 90 then
dbms_output.put_line('A학점입니다');
elsif e_avg >= 80 then
dbms_output.put_line('B학점입니다');
elsif e_avg >= 70 then
dbms_output.put_line('C학점입니다');
elsif e_avg >= 60 then
dbms_output.put_line('D학점입니다');
else
dbms_output.put_line('F학점입니다');
end if;
END;
/

- 키보드로 데이터를 입력 받는 방법
declare
e_num number;
BEGIN
e_num := '&num';
dbms_output.put_line('입력 받은 데이터 >>> ' || e_num);
END;
/


2. case 조건문
case 비교기준
when 값1 then
값1 일 때 수행할 문장;
when 값2 then
값2 일 때 수행할 문장;
when 값3 then
값3 일 때 수행할 문장;
else
값1, 값2, 값3 이 아닌 다른 값일 경우 수행할 문장;
end case; [문제] 키보드로 점수를 입력받아서 학점을 화면에 출력해 보세요DECLARE
e_score number;
BEGIN
e_score := '&score'; -- 키보드 입력
case e_score -- trunce(e_score / 10)
when 90 then -- when 9 then
dbms_output.put_line('A학점입니다');
when 80 then -- when 8 then
dbms_output.put_line('B학점입니다');
when 70 then -- when 7 then
dbms_output.put_line('C학점입니다');
when 60 then -- when 8 then
dbms_output.put_line('D학점입니다');
else
dbms_output.put_line('F학점입니다');
end case;
end;
/

특정 작업을 반복하여 수행하고자 할 때 사용한는 제어문
반복 제어문의 종류
1) 기본 loop
2) while loop
3) for loop
- 기본 loop 반복을 사용해 보자
declare
e_num number := 1;
begin
loop
dbms_output.put_line('e_num >>> ' || e_num);
e_num := e_num + 1;
if(e_num > 10) then
exit;
end if;
end loop;
end;
/

DECLARE
e_su number := 1;
e_sum number := 0; -- 합을 누적시키는 변수
BEGIN
dbms_output.put_line('*** 1 ~ 100 까지의 합 ***');
while e_su <= 100 loop
e_sum := e_sum + e_su;
e_su := e_su + 1;
end loop;
dbms_output.put_line('총 합 >>> ' || e_sum);
end;
/

DECLARE
e_tot number := 0;
BEGIN
dbms_output.put_line('*** for loop문을 이용한 1 ~ 100 까지의 합 ***');
for e_num in 1 .. 100 loop
e_tot := e_tot + e_num;
end loop;
dbms_output.put_line('총 합 >>> ' || e_tot);
end;
/
