create or replace view v_emp as
select empno, ename, deptno from emp;
insert into v_emp values( 1000, '홍길동', 20 );
insert into v_emp values( 1000, '홍길순', 30 );
insert into v_emp values( 1009, '홍길순', 50 );
select * from v_emp;
create or replace view v_emp as
select empno, ename, deptno from emp
with read only;
delete from v_emp where empno = 800;
create or replace view v_emp_info as
select e.empno empno, e.ename ename, d.dname dname
from emp e, dept d
where e.deptno=d.deptno;
select * from v_emp_info;
create sequence seq_tname_colname;
insert into emp(empno, ename,sal, deptno)
values(seq_tname_colname.nextval,'쟈나',15000,30);
select * from emp;
select seq_tname_colname.currval from dual;
select rownum, empno, ename, rowid
from emp where empno =7788;
select rownum, empno, ename, rowid
from emp where ename ='SCOTT';
--------------------------------------------
set serveroutput on;
declare
--변수선언
v_empno NUMBER;
v_ename varchar2(30);
v_hiredate DATE;
BEGIN
--변수값 지정, 값 출력
v_empno:=2000;
v_ename:='이무기';
v_hiredate:='14/07/23';
dbms_output.put_line('사번'||v_empno);
--나머지도
end;
----------------------------------------------
declare
--변수선언
v_empno NUMBER;
v_ename varchar2(30);
v_hiredate DATE;
BEGIN
--sql
select empno, ename, hiredate
into v_empno, v_ename, v_hiredate
from emp
where ename='SCOTT';
dbms_output.put_line('사번'||v_empno);
--나머지도
end;
accept p_ename prompt '조회할 사원이름을 입력'
declare
v_ename emp.ename% TYPE := '&p_ename';
/*
--레코드 선언
type emp_record_type is RECORD (
v_empno emp.empno% TYPE,
v_ename emp.ename% TYPE,
v_job emp.job% TYPE);
--레코드 변수 선언
emp_record emp_record_type;*/
emp_ record emp%ROWTYPE;
BEGIN
SELECT empno, ename, job
into emp_record
from emp
where ename = v_ename;
/*
dbms_output.put_line('사원번호 : '|| emp_record.v_empno);
dbms_output.put_line('사원이름 : '|| emp_record.v_ename);
dbms_output.put_line('사원직무 : '|| emp_record.v_job);
*/
dbms_output.put_line('사원번호 : '|| emp_record.empno);
dbms_output.put_line('사원이름 : '|| emp_record.ename);
dbms_output.put_line('사원직무 : '|| emp_record.job);
EXCEPTION
when no_data_found then dbms_output.put_line('자료가 없습니다.');
when too_many_rows then dbms_output.put_line('자료가 두건 이상 입니다.');
when others then dbms_output.put_line('오류가 발생했습니다.');
end;
set serveroutput on
DECLARE
--배열 선언
TYPE varrar_type is varray(3) of integer;
--배열변수 선언
varray_var varrar_type;
BEGIN
varray_var := varrar_type(100,200,300);
dbms_output.put_line(varray_var(1));
END;
set serveroutput off
set serveroutput on
DECLARE
TYPE nested_type IS TABLE OF VARCHAR2(20); -- 테이블 선언
nested_var nested_type; -- 테이블 변수 선언
BEGIN
nested_var := nested_type('안녕하세요','감사합니다','열심히살자');
FOR i IN 1..3 LOOP
dbms_output.put_line( nested_var(i));
END LOOP;
END;
set serveroutput off
set serveroutput on
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
i BINARY_INTEGER := 1;
BEGIN
FOR r IN ( SELECT ename FROM emp ) LOOP
ename_table(i) := r.ename;
i := i + 1;
END LOOP;
FOR j IN 1..i LOOP
dbms_output.put_line( ename_table(j) );
END LOOP;
END;
/
set serveroutput off
--1. 부서번호를 입력 받아 급여의 합을 출력
set serveroutput on
ACCEPT p_deptno PROMPT '조회할 부서번호는?'
DECLARE
v_sal NUMBER;
BEGIN
SELECT sum(sal) INTO v_sal FROM emp
WHERE deptno = '&p_deptno';
dbms_output.put_line(&p_deptno || '부서의 급여의 합은 ' || v_sal);
END;
--2. 초기값이 8000부터 9999까지 1씩 증가하는 시퀀스(emp_empno_seq)를 생성하여 EMP 테이블에 등록하되, 이름은 JONG, 업무는 MANAGER, 부서번호는 10인 경우
-- 결과는 select로 데이터 입력 확인
-- 익명블록을 몇 번 실행하여 시퀀스값 확인
create sequence emp_empno_seq start with 8000 maxvalue 9999;
DECLARE
BEGIN
INSERT INTO EMP(EMPNO, ENAME, JOB, DEPTNO) VALUES (emp_empno_seq.NEXTVAL, 'JONG','MANAGER',10);
END;
--3. 사원번호가 8000인 사원의 급여에 1000를 더하려면
set serveroutput on;
declare
v_empno emp.empno%TYPE := 8000;
v_sal emp.sal%type;
begin
SELECT empno, nvl(sal,0)
into v_empno, v_sal
FROM emp
where empno = v_empno;
if(v_empno=8000) then v_sal:= v_sal+1000;
end if;
update emp set sal=v_sal
where empno=v_empno;
commit;
end;
--4. 입력한 사원번호의 정보를 삭제
ACCEPT p_empno PROMPT '삭제할 사원 번호를 입력하세요: '
DECLARE
v_sal NUMBER;
BEGIN
DELETE FROM emp WHERE empno = '&p_empno';
END;
--1. 이름, 급여, 부서번호를 입력 받아 사원 테이블에 입력시 부서번호가 20이면 급여의 30%를 추가하고, 사번은 시퀀스를 이용한다.
accept p_name prompt '이름은'
accept p_sal prompt '급여는'
accept p_deptno prompt '부서번호는'
DECLARE
v_name emp.ename%type := upper('&p_name');
v_sal emp.sal%type := &p_sal;
v_deptno emp.deptno%type := &p_deptno;
BEGIN
if v_deptno = 20 then v_sal := v_sal*1.3;
end if;
insert into emp(empno, ename, sal, deptno)values(seq_tname_colname.nextval, v_name, v_sal, v_deptno);
END;
--2. 이름을 입력받아 그 사람의 업무가 MANAGER이면 10% , ANALYST이면 20%, SALESMAN이면 30%, PRESIDENT이면 40%, CLERK이면 50% 급여를 증가한다.
accept p_name prompt '이름은'
DECLARE
v_name emp.ename%type := upper('&p_name');
v_empno emp.empno%type;
v_sal emp.sal%type ;
v_job emp.job%type ;
BEGIN
select empno,job,sal
into v_empno,v_job,v_sal
from emp
where ename=v_name;
if v_job = 'MANAGER' then v_sal := v_sal*1.1;
elsif v_job = 'ANALYST' then v_sal := v_sal*1.2;
elsif v_job = 'SALESMAN' then v_sal := v_sal*1.3;
elsif v_job = 'PRESIDENT' then v_sal := v_sal*1.4;
elsif v_job = 'CLERK' then v_sal := v_sal*1.5;
end if;
update emp set sal = v_sal where empno=v_empno;
END;
select *from emp;
-------------------------------------------------------
accept p_name prompt '이름은'
DECLARE
v_name emp.ename%type := upper('&p_name');
v_empno emp.empno%type;
v_sal emp.sal%type ;
v_job emp.job%type ;
BEGIN
select empno,job,sal
into v_empno,v_job,v_sal
from emp
where ename=v_name;
case v_job
'MANAGER' then v_sal := v_sal*1.1;
when 'ANALYST' then v_sal := v_sal*1.2;
when 'SALESMAN' then v_sal := v_sal*1.3;
when 'PRESIDENT' then v_sal := v_sal*1.4;
when 'CLERK' then v_sal := v_sal*1.5;
end case;
update emp set sal = v_sal where empno=v_empno;
END;
-- 1부터 9까지의 숫자를 입력 받아 해당하는 구구단을 출력
set serveroutput on;
accept p_su prompt '몇단'
declare
v_su integer := &p_su;
i integer;
cnt integer;
begin
for i in 1..9 loop --reverse
cnt := v_su * i;
dbms_output.put_line(v_su ||'*' ||i||'='||cnt);
end loop;
end;
-- 1부터 100까지의 홀수의 합과 짝수의 합을 출력
declare
i integer;
h_sum integer :=0;
j_sum integer:=0;
begin
for i in 1..100 loop --reverse
if i mod 2 = 0 then j_sum := j_sum+i;
else h_sum := h_sum+i;
end if;
end loop;
dbms_output.put_line('홀수의 합은'||h_sum);
dbms_output.put_line('짝수의 합은'||j_sum);
end;
declare
i integer:=0;
h_sum integer :=0;
j_sum integer:=0;
begin
while i <= 100 loop --reverse
if i mod 2 = 0 then j_sum := j_sum+i;
else h_sum := h_sum+i;
end if;
i := i+1;
end loop;
dbms_output.put_line('홀수의 합은'||h_sum);
dbms_output.put_line('짝수의 합은'||j_sum);
end;
--1@ 부서번호를 입력 받아 사원번호, 이름, 급여를 출력
Accept p_deptno prompt '부서번호는'
declare
v_deptno emp.deptno%type := &p_deptno;
v_empno emp.empno%TYPE;
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
cursor e_csr is select empno, ename, sal from emp where deptno = v_deptno;
begin
open e_csr;
loop
fetch e_csr into v_empno, v_ename, v_sal;
exit when e_csr%notfound;
dbms_output.put_line(lpad(v_empno, 10)||lpad (v_ename,20)|| lpad(v_sal,10));
end loop;
close e_csr;
end;
--사번과 급여를 넘겨받아 수정하는 프로시져
create or replace PROCEDURE emp_sal_update(
p_empno in emp.empno%type,
p_sal in emp.sal%type
)is
begin
update emp set sal = p_sal where empno = p_empno;
if SQL%notfound then
dbms_output.put_line('존재하지 않는 사번입니다');
else dbms_output.put_line('성공');
end if;
commit;
end;
exec emp_sal_update(7788,15000);
select object_name, object_type from user_bjects
where object_type = 'PROCEDURE';
--사원명, 업무, 매니저, 급여를 넘겨받아 등록하는 프로시져를 생성 단, 부서번호는 매니저의 부서 번호와 동일하고 사원번호는 시퀀스를 이용.
CREATE OR REPLACE PROCEDURE emp_input (
v_name IN emp.ename%TYPE,
v_job IN emp.job%TYPE,
v_mgr IN emp.mgr%TYPE,
v_sal IN emp.sal%TYPE )
IS
-- 변수선언
v_deptno emp.deptno%TYPE;
BEGIN
SELECT deptno INTO v_deptno FROM emp WHERE empno=v_mgr;
INSERT INTO emp(empno, ename, job, mgr, sal, deptno )
VALUES( emp_empno_seq.nextval, upper(v_name), upper(v_job), v_mgr, v_sal, v_deptno );
EXCEPTION
WHEN NO_DATA_FOUND THEN dbms_output.put_line('입력한 매니저 번호가 없습니다');
WHEN OTHERS THEN dbms_output.put_line('에러발생');
END;
-- 넘겨 받은 사원의 정보 중 부서명과 급여를 검색하는 프로시져
CREATE OR REPLACE PROCEDURE dname_sal_display (
v_ename IN emp.ename%TYPE,
v_dname OUT dept.dname%TYPE,
v_sal OUT emp.sal%TYPE )
IS v_deptno emp.deptno%TYPE;
BEGIN
SELECT deptno, sal INTO v_deptno, v_sal FROM emp WHERE ename=upper(v_ename);
SELECT dname INTO v_dname FROM dept WHERE deptno=v_deptno;
EXCEPTION
WHEN NO_DATA_FOUND THEN dbms_output.put_line('해당 데이터가 없습니다');
WHEN TOO_MANY_ROWS THEN dbms_output.put_line('검색 데이터가 2건 이상입니다.');
WHEN OTHERS THEN dbms_output.put_line('에러발생');
END;
VAR g_dname VARCHAR2(15)
VAR g_sal NUMBER
set serveroutput on
EXECUTE dname_sal_display('SCOTT', :g_dname, :g_sal );
PRINT g_dname
PRINT g_sal
--사원명을 입력받아 부서번호, 부서명, 급여를 검색하는 FUNCTION을 작성하되 부서번호를 리턴한다
CREATE OR REPLACE FUNCTION emp_dis_func ( v_ename IN emp.ename%TYPE )
RETURN NUMBER
IS
v_deptno emp.deptno%TYPE;
v_dname dept.dname%TYPE;
v_sal emp.sal%TYPE;
BEGIN
SELECT deptno, sal INTO v_deptno, v_sal FROM emp WHERE ename=upper(v_ename);
SELECT dname INTO v_dname FROM dept WHERE deptno=v_deptno;
dbms_output.put_line('사 원 명 : ' || v_ename );
dbms_output.put_line('부서번호 : ' || v_deptno );
dbms_output.put_line('부 서 명 : ' || v_dname );
dbms_output.put_line('급 여 : ' || v_sal );
RETURN v_deptno;
EXCEPTION
WHEN NO_DATA_FOUND THEN dbms_output.put_line('해당 데이터가 없습니다');
WHEN TOO_MANY_ROWS THEN dbms_output.put_line('검색 데이터가 2건 이상입니다.');
WHEN OTHERS THEN dbms_output.put_line('에러발생');
END;
--------------------------------------------------------------
--1. 최고의 월급을 받는 사원의 사번을 구하여 출력하는 프로시져
CREATE OR REPLACE PROCEDURE pro_ex1(
v_empno OUT emp.empno%type
)
IS
v_max_sal int;
BEGIN
select max(sal) into v_max_sal
from emp;
select empno into v_empno
from emp where sal=v_max_sal;
dbms_output.put_line('사번 : ' || v_empno);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('사원이 없습니다');
WHEN OTHERS THEN
dbms_output.put_line('에러발생');
END;
/
var empno number --@실행
set serveroutput on
EXECUTE pro_ex1(:empno)
print empno
--2. 이름을 넘겨받아 부서명을 구하여 출력하는 프로시져
CREATE OR REPLACE PROCEDURE pro_ex2(
v_ename in emp.ename%type,
v_dname OUT dept.dname%type
)
IS
v_deptno number;
BEGIN
select dname into v_dname
from emp ee, dept dd
where ee.deptno=dd.deptno and ee.ename=v_ename;
dbms_output.put_line('부서명 : ' || v_dname);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('그 이름의 사원이 없습니다');
WHEN OTHERS THEN
dbms_output.put_line('에러발생');
END;
/
var ename VARCHAR2(10) --@실행
var dname VARCHAR2(10)
set serveroutput on
EXECUTE pro_ex2('SCOTT', :dname)
print dname
--3. 부서번호를 넘겨받아 그 부서의 최고 급여를 구하여 출력하는 함수
CREATE OR REPLACE FUNCTION fun_ex3(
v_deptno in emp.deptno%type
)
RETURN NUMBER -- number타입을 리턴
IS
v_max_sal emp.sal%type;
BEGIN
select max(sal) into v_max_sal
from emp
where deptno=v_deptno;
dbms_output.put_line('최고급여 : ' || v_max_sal);
return v_max_sal;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('에러발생');
END;
/
--@실행
VAR g_max_sal NUMBER;
set serveroutput on
exec :g_max_sal :=fun_ex3(20)
PRINT g_max_sal
--4. 사번과 이동할 부서를 넘겨받아 수정하는 프로시져
--단, 연봉은 기존 연봉의 30% 증가를 하되 이동할 부서의 최고연봉보다 높으면 최고연봉으로 지정하고, 최소연봉보다 낮으면 최소연봉으로 지정한다.
CREATE OR REPLACE PROCEDURE pro_ex4(
v_empno in emp.empno%type,
v_dname in dept.dname%type
)
IS
v_deptno number;
BEGIN
select deptno into v_deptno
from dept where dname=v_dname;
update emp
set deptno=v_deptno
where empno=v_empno;
dbms_output.put_line('이동부서 : ' || v_dname);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('그 부서가 없습니다');
WHEN OTHERS THEN
dbms_output.put_line('에러발생');
END;
/
set serveroutput on
EXECUTE pro_ex4(7369, 'SALES')
select * from emp;
select * from dept;
'it > SQL' 카테고리의 다른 글
pl/sql 공부 (0) | 2015.06.17 |
---|---|
ora-01034 에러. 로그인 안될때, (0) | 2014.08.26 |
07_24 오라클... (0) | 2014.08.14 |
07_22 오라클 sql문 (0) | 2014.08.14 |
07_21 오라클 sql문 (0) | 2014.08.14 |