지난 시간 복습
시퀀스 적용 미션
addrmemo 테이블에 번호(ano) 이름(aname) 주소(addr) 전화번호(atel)
번호에 시퀀스 적용 (ano_seq)
데이터 5개 정도 적용
create table addrmemo(ano number, aname varchar2(300), addr varchar2(300), atel varchar2(300));
create sequence addrmemo_ano_seq increment by 1 start with 1 maxvalue 100 minvalue 1 cycle cache 2;
select * from addrmemo;
/
begin
for i in 1..100 loop
insert into addrmemo values(addrmemo_ano_seq.nextval,'강지수','addr','tel');
end loop;
end;
/
PL : Procedural Language
PL/SQL : Oracle's Procedural Language extension to SQL
강의자료
간단히 설명한 Procedure 의 구조
프로시져 실행됨
bit data3,hong3 이 스크립트에 출력됨
set serveroutput off; 하면 출력 안됨
미션
emp Table에 적용
8000 n TOM v ANALYST v 7839 n 오늘날짜 3500 n 500 n 20 n 삽입
n : number / v : varchar2
procedure 로 update 하기
extract 를 사용하면 hire_date 에서 year 만 추출 가능
활용하면 이렇게 조건으로 줄 수도 있다.
-- Procedure 1
/
create or replace procedure yearselect(
p_year number
)
is
-- 변수 선언
id employees.employee_id%TYPE;
name employees.last_name%TYPE;
hiredate employees.hire_date%TYPE;
begin
select employee_id,last_name,hire_date into id,name,hiredate from employees where extract(year from hire_date)=p_year;
dbms_output.put_line(id ||','|| name ||','|| hiredate);
end;
/
exec yearselect(2001);
-- 현재는 결과가 1행일 때만 가능
이 procedure는 조건에 맞는 결과가 1개라서 (row 가 1개라서) 실행가능
-- Procedure 2
/
create or replace procedure yearselect(
p_year number
)
is
-- Table 의 Type 을 전부 가져오기
emp employees%ROWTYPE;
-- 커서 등록
cursor emp_cur is select employee_id,last_name,hire_date from employees where extract(year from hire_date)=p_year;
begin
open emp_cur;
loop
-- 데이터 읽기
fetch emp_cur into emp.employee_id,emp.last_name,emp.hire_date;
exit when emp_cur%notfound;
dbms_output.put_line(emp.employee_id ||','|| emp.last_name ||','|| emp.hire_date);
end loop;
close emp_cur;
end;
/
exec yearselect(2003);
커서와 반복문을 이용해서 여러 줄의 내용도 실행 가능
alter : Data Table 구조 관련 명령, Data 구조를 정의할 때 사용 (생성,변경,삭제, 이름 변경)
테이블 이름 변경
칼럼 추가
칼럼 삭제
칼럼 이름 변경
칼럼 타입 변경
칼럼 타입을 변경하려면 값이 전부 없어야 한다.
from, select 에도 subquery 사용 가능
Procedure 안에서 if 문 사용
Procedure 안에서 case 문 사용
Procedure 안에서 loop 문 사용
Procedure 안에서 while 문 사용
Procedure 안에서 for 문 사용
Procedure 안에서 exception 문 사용 (예외발생)
-- join 보충
-- 테이블 3개
create table student2(no number, name varchar2(15), subject_id number, score number);
create table grade(grade char(4), min_score number, max_score number);
create table subject(subject_id number, subject_name varchar2(30));
insert into subject values(10,'Computer Enginnerring');
insert into subject values(20,'Music');
insert into subject values(30,'English');
insert into subject values(40,'History');
insert into subject values(50,'Math');
commit;
insert into student2 values(1000,'James',10,98);
insert into student2 values(1001,'Ford',10,91);
insert into student2 values(1002,'Allen',20,89);
insert into student2 values(1003,'Steve',30,83);
insert into student2 values(1004,'Miller',40,78);
commit;
insert into grade values('A+',96,100);
insert into grade values('A0',90,95);
insert into grade values('B+',86,89);
insert into grade values('B0',80,85);
insert into grade values('C+',76,79);
insert into grade values('C0',70,75);
insert into grade values('D+',66,69);
insert into grade values('D0',60,65);
insert into grade values('F',0,64);
commit;
select * from student2;
select * from grade;
select * from subject;
equip join (등가조인)
select s.name, b.subject_name from student2 s join subject b on s.subject_id=b.subject_id;
select s.name, b.subject_name, s.score, g.grade from student2 s join subject b on s.subject_id=b.subject_id join grade g
on s.score between g.min_score and g.max_score;
Ansi Join Style
select s.name, b.subject_name, s.score, g.grade from student2 s, subject b, grade g
where s.subject_id=b.subject_id and s.score between g.min_score and g.max_score;
Oracle Join Style
오전은 여기까지