본문 바로가기

빅데이터과정/PL/SQL

#8_140624_PL_SQL_ 기본

728x90

#8_140624_PL_SQL_ 기본


PL/SQL(Procedure Language, 절차적 언어)
-       SQL + C언어

오류가 나서 부르기전에 2번 확인
-       오류를 스스로 찾아보고
-       짝궁의 도움 or notepad++ 의 비교기능(내가 작성 vs 정답소스)


금융권에 쓰는 금융 패키지 – 오라클 PL/SQL(프랑스)




PL/SQL의 종류
-       익명(1)블록과 그 외 블록(2,3,4,5)의 차이는 DB에 이름을 가지고 저장 여부이다
1. 익명 블록(anonymous PL/SQL block)
2. procedure
3. function
4. trigger
5. package





문제1. 사원번호를 입력하면 해당 사원의 월급이 출력되는 PL/SQL 프로그램을 작성하시오

set serveroutput on
accept p_empno prompt '사원번호를 입력하시오!'

declare
v_empno number(10) := &p_empno;
v_sal number(10);

begin
select sal into v_sal
from emp
where empno=v_empno;

dbms_output.put_line ('월급은 ' || v_sal);

end;
/


set serveroutput on
// dmbs_output.put_line 을 작동시키기 위한 명령어
accept p_empno prompt ‘사원번호를 입력하시오!’
// promt : 야기시키다. ‘사원번호~’를 출력하도록 야기하시오.
// p_empno 는 변수사원번호를 입력하면 p_empno에 입력


declare    // 선언절 : 변수상수커서예외 선언
v_empno number(10) := &p_empno   // := 할당연산자. v_empno에 할당해줌
v_sal number(10);                    // v_sal라는 변수에 숫자를 담아라

begin     // 실행절
select sal into v_sal
from emp
where empno = v_empno;

dbms_output.put_line (‘ 월급은 ‘ || v_sal);
// 출력을 위한 오라클 내장 패키지

end;              // PL SQL 문을 끝내겠다
/



문제2. 사원 이름을 물어보게 하고 사원 이름을 입력하면 해당 사원의 월급이 출력되게 하시오

ed p2.sql
@p2.sql

set serveroutput on
accept p_ename prompt '사원이름를 입력하시오!'

declare
v_ename varchar2(10) := '&p_ename';
v_sal number(10);

begin
select sal into v_sal
from emp
where ename=v_ename;

dbms_output.put_line ('월급은 ' || v_sal);

end;
/

문제3. 직업을 입력하면 해당 직업의 토탈월급이 출력되게 하시오

set serveroutput on
accept p_job prompt '직업이름를 입력하시오! '

declare
v_job varchar2(20) := '&p_job';
v_sumsal number(10);

begin
select SUM(sal) into v_sumsal
from emp
where job=v_job;

dbms_output.put_line ('토탈월급은 ' || v_sumsal);

end;
/

문제4. 위의 소스를 수정하는데 직업을 소문자로 입력하던 대문자로 입력하던 상관없이 결과가 출력되게 하시오

set serveroutput on
accept p_job prompt '직업이름를 입력하시오! '
set verify off

declare
v_job varchar2(20) := '&p_job';
v_sumsal number(10);

begin
select SUM(sal) into v_sumsal
from emp
where job=UPPER(v_job);

dbms_output.put_line ('월급은 ' || v_sumsal);

end;
/
set serverouput off

set verify off : 지저분한 내용 없앰

문제5. 부서번호를 물어보게 하고 부서번호를 입력하면 해당 부서번호에서 근무하는 사원들의 인원수를 출려고되게 하시오

set serveroutput on
set verify off
accept p_deptno prompt '부서번호를 입력하시오! '

declare
v_deptno number(10) := &p_deptno;
v_count number(10);

begin
select COUNT(*) into v_count
from emp
where deptno=v_deptno;

dbms_output.put_line ('인원수는 ' || v_count);

end;
/

문제6. 사원번호를 물어보게 하고 사원번호를 입력하면 해당 사원의 이름과 월급과 직업이 아래와 같이 출력되게 하시오
이름 : SCOTT
월급 : 3000
직업 : ANALYST

set serveroutput on
set verify off
accept p_empno prompt '사원번호를 입력하시오! '

declare
v_empno emp.empno%type := &p_empno;
v_ename emp.ename%type;
v_sal emp.sal%type;
v_job emp.job%type;

begin
select ename, sal, job into v_ename, v_sal, v_job
from emp
where empno=v_empno;

dbms_output.put_line ('이름 : ' || v_ename);
dbms_output.put_line ('월급 :  ' || v_sal);
dbms_output.put_line ('직업 :  ' || v_job);

end;
/

문제7. 사원 테이블의 job 데이터 타입의 길이를 varchar2(9) à varchar2(20) 으로 변경하시오

ALTER TABLE EMP
MODIFY job VARCHAR2(20);
타입을 변경하면 v_job의 타입도 변경된다

문제8. 부서번호를 물어보게 하고 부서번호를 입력하면 해당 부서번호의 부서위치와 부서명이 아래와 같이 출력되게 하시오

부서위치 : DALLAS
부서명 : SALES

set serveroutput on
set verify off
accept p_deptno prompt '부서번호를 입력하시오! '

declare
v_deptno dept.deptno%type := &p_deptno;
v_loc dept.loc%type;
v_dname dept.dname%type;

begin
select loc, dname into v_loc, v_dname
from dept
where deptno=v_deptno;

dbms_output.put_line ('이름 : ' || v_loc);
dbms_output.put_line ('부서명 :  ' || v_dname);

end;
/


마지막문제9. 이름을 물어보게 하고 이름을 입력하면 해당 사원의 월급의 순위가 출력되게 하시오

set serveroutput on
set verify off
accept p_ename prompt '이름를 입력하시오! '

declare
v_ename emp.ename%type := upper('&p_ename');
v_rank number(10);

begin
SELECT 순위 INTO v_rank
FROM(SELECT ename, job, sal, RANK() OVER(ORDER BY sal desc) 순위
             FROM emp)
where ename=v_ename;

dbms_output.put_line ('순위 : ' || v_rank);

end;
/

마지막문제10. 부서번호를 물어보게 하고 부서번호를 입력하면 해당 부서번호에 속한 사원들의 이름을 가로로 출력하시오

set serveroutput on
set verify off
accept p_deptno prompt '부서번호를 입력하시오! '

declare
v_deptno emp.deptno%type := &p_deptno;
v_emp VARCHAR(100);
            
begin
select deptno, listagg(ename,',') within GROUP (ORDER BY ename) into v_deptno, v_emp
from EMP
where deptno=v_deptno
GROUP BY deptno;

dbms_output.put_line ('부서번호 : '|| v_deptno || ' - ' || v_emp);

end;

/


문제70. 사원 테이블에 순위라는 컬럼을 아래와 같이 추가하고 사원이름을 물어보게 하고 사원이름을 입력하면 해당 사원의 순위가 자기의 월급에 대한 순위로 갱신되게 하시오

ALTER TABLE EMP
ADD rnk NUMBER(10);

accept p_ename prompt '이름을 입력하시오 '
declare
 v_ename emp.ename%type := upper('&p_ename');
 v_rank  number(2);
begin
 SELECT 순위 into v_rank
 FROM ( SELECT ename, RANK() OVER(ORDER BY sal desc) 순위 FROM EMP)
 WHERE ename = v_ename;

 UPDATE EMP
 SET rnk = v_rank
 WHERE ename = v_ename;

 dbms_output.put_line('수정된 행의 갯수는 ' || SQL%rowcount);
 dbms_output.put_line(v_ename || ' 의 순위는 ' || v_rank || ' 입니다. ');
end;
/


'빅데이터과정 > PL/SQL ' 카테고리의 다른 글

#9_140625_PL_SQL_IF 문  (0) 2014.07.14
#9_140625_PL_SQL_진리연산표  (0) 2014.07.14
#9_140625_PL_SQL_변수의 데이터 유형  (0) 2014.07.14
#9_140625_PL_SQL_BIND 변수  (0) 2014.07.14
#9_140625_AUTOPRINT  (0) 2014.07.14