-
PL/SQL p.101 시작
제어문
if 조건식1
then 구문1 (다수 가능)
elsif 조건2 (스펠링 확인,,, 저게 맞다는데?)
then 구문2 (다수 가능)
else
구문3 (다수 가능)
end if;
create or replace procedure dept_search(p_empno IN emp.empno%type) is --decalre v_deptno emp.deptno%type; begin dbms_output.enable; --메시지 버퍼 활성화 select deptno into v_deptno from emp where empno = p_empno ; if v_deptno = 10 then dbms_output.put_line('ACCOUNTING 부서 사원입니다.'); elsif v_deptno = 20 then dbms_output.put_line('RESEARCH 부서 사원입니다.'); elsif v_deptno = 30 then dbms_output.put_line('SALES 부서 사원입니다.'); else dbms_output.put_line('OPERATIONS 부서 사원입니다.'); end if; --여긴 디폴트값인거 같아 end; / exec dept_search(7521); --명령문 상황에서 inline 주석 사용할 수 없다네;;
loop문
loop - while / do ~ while
loop
~
exit when ~
end loop;
for loop - for
while loop
procedure
특정 작업을 수행하는 이름이 있는 PL/SQL 블록
create or rreplace procedure procedure_name in argument out argument in out argument is [변수 선언] begin [PL/SQL 블록] [exception] end;
Procedure Example
--프로시저 예제 -- 약간 main이라고 생각하면 되려나? create or replace procedure hello is msg varchar2(100) := 'Hello Oracle!' ; begin dbms_output.put_line(msg) ; end; / exec hello; -- 프로시저 실행까지
Procedure check
select object_name, object_type from user_objects where object_type = 'PROCEDURE' ;
매개변수
Procedure에 value를 input할 때에 사용
create or replace procedure prc_arg (arg_ename emp.ename%type) is p_empno emp.empno%type; begin -- 사원 이름으로 사원번호 조회해서 변수 p_empno에 input select empno into p_empno from emp where ename = arg_ename ; --출력 dbms_output.put_line('사원 번호는 '||p_empno||'번 입니다.') ; end ;
매개변수 in / out / in out
in : procedure 실행 시 넘겨줄 매개변수
out : procedure에게 반환받을 매개변수
in out : procedur에게 값도 전달하고 반환도 받고
--매개변수 예제 create or replace procedure prc_arg_io (arg_empno in emp.empno%type, arg_ename out emp.ename%type, arg_sal out emp.sal%type, arg_job out emp.job%type) -- procedure 안의 변수들 선언 is begin --사원번호를 조회해서 각 매개변수 값 대입 select ename, sal, job into arg_ename, arg_sal, arg_job from emp where empno = arg_empno ; end ; / --바인드 변수를 선언해야하나봐 아마, 실행시킬 때에 사원번호만 입력하면 안되니까,,, --out매개변수를 담아오기위해 실행부분에 선언하는 변수. variable var_ename varchar2(15); variable var_sal number; variable var_job varchar2(9); exec prc_arg_io(7782, :var_ename, :var_sal, :var_job); -- 여기선 ';'가 내려오면 안돼!!!! ****** print var_ename; print var_sal; print var_job;
out 매개변수를 담아오기위해 실행부분에 선언하는 변수 = 바인드 변수
함수
주로 값을 계산하고 결과를 반환하기 위해 많이 사용
create or replace function fnc_annsal (arg_empno emp.empno%type) return number --필수 is p_sal emp.sal%type; -- 변수 선언 begin select sal into p_sal from emp where empno = arg_empno ; --리턴 return (p_sal*12) ; end; / --바인드 변수 선언 variable var_annsal number; exec :var_annsal := fnc_annsal(7782); print var_annsal;
create or replace function fnc_name [arguement] return datatype --반환되는 데이터 타입 is [변수 선언 부분] begin [PL/SQL block] -- 리턴문이 꼭 존재해야 한다. return 변수; end;
커서
select 문의 조회 결과가 1행 이상일 떄, 커서를 통해 처리
%rowtype을 이용해 한 행단위를 담을 수 있는 변수를 선언하고,
커서변수에 다중행의 조회결과를 담는다.
이를 반복문을 통해 한 행 씩 순회하며, 데이터를 처리
declare cursor cursor_name is statement - 커서선언 begin for record_name in cursor_name loop statement end loop; end ;
--커서 예제 create or replace procedure prc_cursor is p_row dept%rowtype; cursor c1 is select * from dept; --변수, 커서 선언 begin dbms_output.put_line('부서번호/부서명/지역'); dbms_output.put_line('----------------'); --반복문 for p_row in c1 loop exit when c1%notfound; dbms_output.put_line(p_row.deptno||'/'||p_row.dname||'/'||p_row.loc); end loop; end; / exec prc_cursor;
패키지
procedure, function을 묶어서 효율적으로 관리하기 위함
--패키지 예제 create or replace package pkg is function fnc_annsal(arg_empno emp.empno%type) return number; --함수에는 리턴값 필수 procedure prc_arg(arg_ename emp.ename%type); end; / create or replace package body pkg is --함수 정의 function fnc_annsal(arg_empno emp.empno%type) return number is p_sal number(7, 2); begin --사원이름으로 사원번호 조회 후 변수 p_ sal에 대입 select sal into p_sal from emp where empno = arg_empno; return (p_sal*12); end; --프로시져 정의 procedure prc_arg(arg_ename emp.ename%type) is p_empno emp.empno%type; begin --사원이름으로 사원번호 조회 후, p_empno에 대입 select empno into p_empno from emp where ename = arg_ename ; --출력 dbms_output.put_line('사원 번호는 '||p_empno||'입니다.'); end; end; / variable var_annsal number; exec :var_annsal := pkg.fnc_annsal(7782); print var_annsal; exec pkg.prc_arg('KING');
트리거
지정한 조건을 만족하면 특정 이벤트를 발생시키는 데이터베이스 객체
insert, update, delete문이 테이블에 대해 행해질 때 암묵적으로 수행되는 procedure
테이블의 변화에 영향을 받아 동작하지만 별도의 데이터베이스의 저장된다.
뷰가 아닌 테이블에 대해서만 정의
create or replace triggeer trg_name [ before | after ] [ insert | update | delete ] on table_name [ for each each ] begin [PL/SQL Block] end ;
TRIGGER.insert
create or replace trigger trg_insert after insert on emp01 for each row begin insert into emp02 values (:new.empno, :new.ename, :new.job); end; / insert into emp01 values (1, 'green', 'carpenter') ; insert into emp01 values (2, 'yellow', 'painter') ; insert into emp01 values (3, 'blue', 'programmer') ;
:old
:new
생각
TRIGGER.update
create or replace trigger trg_update after update on emp01 for each row begin update emp02 set ename =:new.ename, job =:new.job where empno = :new.empno --primary key라 변경 불가인건가?? ; end; / update emp01 set ename = 'violet' where empno = 3 ;
TRIGGER.delete
create or replace trigger trg_delete after delete on emp01 for each row begin delete from emp02 where empno =:old.empno ; end; / delete from emp01 where empno = 3 ;