# 데이터베이스/오라클

pl/sql, 수행 속도 향상, 모듈화, 자동화가 가능,

dev-jjong 2013. 4. 9. 20:42

--PL/SQL : 수행 속도 향상, 모듈화, 자동화가 가능;
create table aa(bun number, munja varchar2(10), su number);
select * from aa;
--변수 선언
declare no number:=0;    -- 변수 만드는방법이다.  (:= plsql의  치환 연산자)
begin
  no := 500 + 400;
  insert into aa(bun) values(no);   --이 줄은 결과확인용이라서 별로 중요하진않다.
end;
/
select * from aa;

--해당 테이블 형으로 변수 선언
declare
  v_a sawon%rowtype;  --   v_a는 sawon타입이면서, rowtype(행을 담을 수있는 타입) 타입이다.
begin
  select * into v_a from sawon where sawon_no=1;
  insert into aa values(v_a.sawon_no, v_a.sawon_name, v_a.sawon_pay);    --이 줄은 결과확인용이라서 별로 중요하진않다.
end;
/
select * from aa;


--해당 테이블 칼럼형으로 변수 선언
declare
  a sawon.sawon_no%type;
  b sawon.sawon_name%type;
  c sawon.sawon_pay%type;
begin
  select sawon_no, sawon_name, sawon_pay into a,b,c from sawon   --into a,b,c  사원넘 사원이름 사원페이를 a,d,c 변수에 넣었다는 뜻이다.
  where sawon_no=6;
  insert into aa values(a,b,c);
end;
/
select * from aa;


--조건 판단문 if
declare
  v_a sawon%rowtype;   --v_a는 사원 테이블의 레코드를 rowtype(행을 담을 수있는 타입)으로 담을 수 있는 변수이다.
  v_str varchar2(10);
begin
  select * into v_a from sawon where sawon_no=9;
  if(v_a.buser_num=10) then v_str:=concat(v_a.sawon_name,' 10'); end if;
  if(v_a.buser_num=20) then v_str:=concat(v_a.sawon_name,' 20'); end if;
  if(v_a.buser_num=30) then v_str:=concat(v_a.sawon_name,' 30'); end if;
  if(v_a.buser_num=40) then v_str:=concat(v_a.sawon_name,' 40'); end if;
  insert into aa values(v_a.sawon_no,v_str,v_a.sawon_pay);
end;
/

delete from aa;
--반복문 for-loop
declare
  dan number(2):= 2;
  i number(2):= 0;
  tot number:= 0;
begin
  for i in 1..9 loop            --변수 i는 1부터 9까지 loop
  tot:= dan * i;
  insert into aa values(i,'=',tot);
 
  end loop;
end;
/
select * from aa;
delete from aa;


--반복문 while loop ~ end loop
declare
  v_count number := 1;
begin
  loop
    insert into aa(bun) values(v_count);
    exit when (v_count=10);   --exit를 줘서 v_count=10이 될때 루프를 빠져나감.
    v_count := v_count+1;
  end loop;
end;
/
select * from aa;

-----while문 두번째 방법---------
declare
  v_count number := 0;
begin
  while(v_count <= 10) loop
    v_count := v_count+1;
    insert into aa(bun) values(v_count);
  end loop;
end;
/
select * from aa;
delete from aa;

------while과 if를 섞어서 쓰기 연습--------
declare
  v_a number:=0;
  v_b number:=0;
begin
  while(v_a < 10)
    loop
    v_a := v_a+1;
    if(mod(v_a, 2)=0) then    --v_a를 2로 나눈 나머지가 0이면 then이후의 작업을 하겠다는 뜻
      v_b := v_b+10;
      insert into aa values(v_a,'짝',v_b);
    else
      v_b := v_b + 3;
      insert into aa values(v_a,'홀',v_b);
    end if;
  end loop;
end;
select * from sawon;

--커서 : 사용자가 실행한 SQL문의 단위를 의미한다. -cursor는 select의 결과를 기억하고 있는 기억장소다!
형식)
cursor 커서명
open 커서명
fetch 커서명 into 변수명
close 커서명

연습1)

create table ss as select sawon_no, sawon_name, sawon_pay from sawon
where 1=0;


declare
  no number;
  name varchar2(10);
  pay number;
  cursor c1 is select sawon_no, sawon_name, sawon_pay from sawon --cursor는 select의 결과를 기억하고 있는 기억장소다!
  where sawon_jik='사원';
begin
  open c1;   --커서는 언제든지 열고 써야한다. 그리고 끝에 닫아 준다.
  loop
    fetch c1 into no, name, pay;    --fetch는 c1에서 자료를 하나씩 빼내오는 것
    exit when c1%notfound;    --c1이 더이상 자료를 가지지않았다고 했을때 exit
    insert into ss values(no,name,pay);
  end loop;
  close c1;
end;
/
select * from ss;


연습2)

declare
  saw sawon%rowtype;
  cursor c1 is select sawon_no, sawon_name, sawon_pay from sawon where sawon_jik='과장';
begin
  for saw in c1 loop   --c1이 가지고있는 데이터를 saw에게 하나씩 넘겨준다.
  insert into ss values(saw.sawon_no, saw.sawon_name, saw.sawon_pay);
  end loop;
end;
/
select * from ss;