--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;
'# 데이터베이스 > 오라클' 카테고리의 다른 글
[ORACLE] 대용량 테이블 생성 (1,000만건) (1) | 2021.10.07 |
---|---|
오라클 함수 작성, procedure 작성, 수정, 삭제, 연습문제 (2) | 2013.04.09 |
synonym(동의어) (0) | 2013.04.09 |
오라클 계정 생성, 권한, 보안, 권한 관련,grant,revoke (0) | 2013.04.09 |
Deadlocks, 데드락 해결방안, VIEW 테이블, 수정, 삭제, 생성, 연습문제 (0) | 2013.04.09 |