IT Study/Database-Oracle
PROCEDURE
도뿌리
2018. 6. 28. 14:37
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | -- update_sal 프로시저는 사원번호를 입력 받아서 급여를 인상 CREATE OR REPLACE PROCEDURE update_sal( v_empno IN NUMBER ) IS BEGIN UPDATE EMPLOYEES SET SALARY = SALARY *1.3 WHERE EMPLOYEE_ID = v_empno; END update_sal; / SELECT * FROM EMPLOYEES; EXECUTE update_sal(100); ROLLBACK; -- EMPLOYEE_ID의 자료형을 가져옴 CREATE OR REPLACE PROCEDURE emp_info(p_empno IN EMPLOYEES.EMPLOYEE_ID%TYPE) IS v_empno EMPLOYEES.EMPLOYEE_ID%TYPE; v_ename EMPLOYEES.FIRST_NAME%TYPE; v_sal EMPLOYEES.SALARY%TYPE; BEGIN SELECT EMPLOYEE_ID, FIRST_NAME, SALARY INTO v_empno,v_ename,v_sal FROM EMPLOYEES WHERE EMPLOYEE_ID = p_empno; DBMS_OUTPUT.PUT_LINE('사원번호: ' || v_empno); DBMS_OUTPUT.PUT_LINE('이름: ' || v_ename); DBMS_OUTPUT.PUT_LINE('급여: ' || v_sal); END; / SET SERVEROUTPUT ON; EXECUTE emp_info(100); CREATE OR REPLACE PROCEDURE EMP_INFO(e_empno IN employees.employee_id%TYPE) IS v_emp employees%ROWTYPE; -- employee의 모든 자료형이 다 들어가잇음 BEGIN SELECT EMPLOYEE_ID, FIRST_NAME, SALARY INTO v_emp.EMPLOYEE_ID, v_emp.FIRST_NAME, v_emp.SALARY FROM EMPLOYEES WHERE EMPLOYEE_ID = e_empno; DBMS_OUTPUT.PUT_LINE('사원번호: ' || v_emp.EMPLOYEE_ID); DBMS_OUTPUT.PUT_LINE('이름: ' || v_emp.FIRST_NAME); DBMS_OUTPUT.PUT_LINE('급여: ' || v_emp.SALARY); END; / SET SERVEROUTPUT ON; EXECUTE EMP_INFO(100); -- 같은 자료형의 묶음 : ARRAY CREATE OR REPLACE PROCEDURE TABLE_TEST( v_deptno IN DEPARTMENTS.DEPARTMENT_ID%TYPE ) IS TYPE empno_table IS TABLE OF EMPLOYEES.EMPLOYEE_ID%TYPE INDEX BY BINARY_INTEGER; -- 배열 선언 TYPE ename_table IS TABLE OF EMPLOYEES.FIRST_NAME%TYPE INDEX BY BINARY_INTEGER; -- 배열 선언 TYPE sal_table IS TABLE OF EMPLOYEES.SALARY%TYPE INDEX BY BINARY_INTEGER; -- 배열 선언 empno_tap empno_table; ename_tap ename_table; sal_tap sal_table; i BINARY_INTEGER := 0; -- int i = 0; BEGIN FOR emp_list IN (SELECT EMPLOYEE_ID, FIRST_NAME, SALARY FROM EMPLOYEES WHERE DEPARTMENT_ID = v_deptno) LOOP i := i+1; empno_tap(i) := emp_list.EMPLOYEE_ID; ename_tap(i) := emp_list.FIRST_NAME; sal_tap(i) := emp_list.SALARY; END LOOP; -- 출력 FOR cnt IN 1 .. i LOOP DBMS_OUTPUT.PUT_LINE('사원번호: ' || empno_tap(cnt)); DBMS_OUTPUT.PUT_LINE('이름: ' || ename_tap(cnt)); DBMS_OUTPUT.PUT_LINE('급여: ' || sal_tap(cnt)); END LOOP; END; / SET SERVEROUTPUT ON; EXECUTE TABLE_TEST(60); /* 이름, 급여, 부서번호를 입력받아 EMPLOYEES 테이블에 자료를 등록하는 SCRIPT를 작성하여라. 단 10번 부서일 경우, 입력한 급여의 20%를 추가하고 초기값이 9000부터 9999까지 1씩 증가하는 SEQUENCE(EMP_EMPNO_SEQ)작성하여 사용하고 아래의 표를 참고하여라 이 름: 홍길동 급 여: 2000 부서번호: 10 */ -- SEQUENCE 만들어줌 CREATE SEQUENCE EMP_EMPNO_SEQ INCREMENT BY 1 -- 1씩 증가 START WITH 9000 MAXVALUE 9999; CREATE OR REPLACE PROCEDURE SCRIPT_TEST(p_ename IN EMPLOYEES.LAST_NAME%TYPE, sal IN EMPLOYEES.SALARY%TYPE, p_deptno IN EMPLOYEES.DEPARTMENT_ID%TYPE) IS p_sal EMPLOYEES.SALARY%TYPE := sal; BEGIN IF p_deptno = 10 THEN p_sal := p_sal*1.2; --파라미터를 바로 사용하면 에러떠서 선언부에서 값을 받아서 바꿔줌 END IF; INSERT INTO EMPLOYEES(EMPLOYEE_ID, LAST_NAME, EMAIL, HIRE_DATE, JOB_ID, SALARY, DEPARTMENT_ID) VALUES (EMP_EMPNO_SEQ.NEXTVAL, p_ename, p_ename||'@naver.com', SYSDATE,'IT_PROG',p_sal,p_deptno); END; / SET VERIFY OFF; SET SERVEROUTPUT ON; ACCEPT p_ename PROMPT '이름 입력:'; ACCEPT p_sal PROMPT '급여 입력:'; ACCEPT p_deptno PROMPT '부서번호 입력:'; EXECUTE SCRIPT_TEST('&p_ename','&p_sal','&p_deptno'); SET VERIFY ON; SET SERVEROUTPUT OFF; select * from employees; | cs |