Day29

Day29

1.Transcation을 이해하고 구현 할 수 있다.

2.lock 개념을 이해 할 수 있다.

3.오라클의 프로시저를 설계하고 기술 할 수 있다.

4.PL/SQL의 구문을 이해하고 기본 문법 및 설계를 학습 할 수 있다.


문제

Q1.트랜잭션 : 데이터 일관성을 유지 하려는 목적으로 사용하는 논리적으로 연관된 작업들의 집합

  • 하나 이상의 연관된 DML구문
  • 하나 이상의 DDL구문
  • 트랜잭션 시작 : 첫번째 DML 구문이 실행될 때 시작됨
  • 트랜잭션 종료 :

1) COMMIT/ROLLBACK 명령이 실행될 때 종류
2) DDL 구문이 실행될 때 종료 -> AUTO COMMIT
3) SQL*PLUS OR DBSERVER 가 비정상적으로 종료될 때 -> AUTO ROLLBACK (백업을 하지 않는다)

  • 트랜잭션 제어
    COMMIT(저장) : 변경된 데이터를(insert,delete,update) 저장하고 트랜잭션을 종료하는 명령
    ROLLBACK(취소) : 변경 작업을(insert,delete,update) 취소하고 트랜잭션을 종료하는 명령
    기본적으로 데이터 상태를 트랜잭션의 시작 시점으로 되돌린다.
    SAVEPOINT savepoint_name : 트랜잭션의 특정 시점을 기록하는 명령
    ROLLBACK TO savepoint_name : 지정한 특정 시점으로 데이터 상태를 되돌릴 수 있음

commit :
변경 내용이 데이터 베이스(파일)에 저장 및 반영
모든 사용자는 변경된 동일한 결과를 볼 수 있다.

동일한 행에 대해 다른 변경 작업이 가능하다.
지금까지 설정된 모든 savepoint는 사라짐

rollback :
데이터 이전 상태로 복구한다.
동일한 행에 대해 다른 변경 작업 가능
지금까지 설정한 모든 savepoint는 사라진다.

트랜잭션 데이터
1)다른 사용자는 현재 작업 중인 DML의 결과를 볼 수 없다.
2)작업 중인 행에 대해 다른 변경 작업을 할 수 없음


Q2.트랜잭션과데이터 상태를 확인 해보자.

ALTER TABLE EMPLOYEE
DISABLE CONSTRAINTS FK_MGRID;

SAVEPOINT S0;

ALTER TABLE DEPARTMENT
DROP COLUMN MGR_ID;

ALTER TABLE DEPARTMENT
DROP COLUMN MGR_ID02;

INSERT INTO DEPARTMENT VALUES('40','기획전략팀','A1');

SAVEPOINT S1;

UPDATE EMPLOYEE SET DEPT_ID ='40'
WHERE DEPT_ID IS NULL;

SAVEPOINT S2;
DELETE FROM EMPLOYEE;

ROLLBACK TO S2; -- SAVEPONT S2 를 롤백시킨다.

SELECT COUNT(*) FROM EMPLOYEE; --22개

SELECT COUNT(*) FROM EMPLOYEE
WHERE DEPT_ID = '40';

ROLLBACK TO S1;

SELECT COUNT(*) FROM DEPARTMENT
WHERE DEPT_ID ='40'; --1

40번 사원 테이블도 확인

ROLLBACK TO S0;
1,2번 확인

ROLLBACK

Q3.동시성 LOCK : 다수 사용자가 동시에 동일한 데이터에 접근 해서 변경 시도 가능
무결성을 보장하기 위해 동시성을 제어하는 것이 필요함

데이터 동시성 제어 기법에 대한 특징
1) 서로 다른 사용자가(서로 다른 트랜잭션) 동시에 동일한 행을 변경 할 수 없도록 방지
2) 다른 사용자 (다른 트랜잭션)가 COMMIT 되지 않은 변경 내용을 Over Write 할 수 없도록 방지
3) 트랜잭션이 실행되는 동안 자동으로 수행/유지/관리 됨

세션 1

SELECT EMP_NAME,
MARRIAGE
FROM EMPLOYEE
WHERE EMP_ID = '143';

UPDATE EMPLOYEE
SET MARRIAGE = 'N'
WHERE EMP_ID ='143';


MARRIAGE를 N으로 수정

세션 2

SELECT EMP_NAME,
MARRIAGE
FROM EMPLOYEE
WHERE EMP_ID = '143';

UPDATE EMPLOYEE
SET MARRIAGE ='N'
WHERE EMP_ID='143';

세션1 에서 MARRIAGE를 N으로 수정해놓고 COMMIT OR ROLLBACK을 하지않았기에
LOCK 이 걸린다
COMMIT OR ROLLBACK을 하면 LOCK이 풀리고 UPDATE를 실행할 수 있다.


데이터 타입/ 변수와 상수/ 연산자/표준입출력/제어문 반복,선택,분기문/ 함수,프로시저(리턴X)메소드(OOP) 파일 입출력

IF 조건 THEN 명령
ELSIF THEN
ELSE
END IF;


Q3.점수에 대한 학점을 A~F로 IF 문으로 구현 해보자.

DECLARE
 score01 int := 85;
 grade01 varchar2(2);
BEGIN
 IF score01 >= 90  THEN grade01 :='A';
 ELSIF score01 >=80 THEN grade01 :='B';
 ELSIF score01 >=70 THEN grade01 :='C';
 ELSIF score01 >=60 THEN grade01 :='D';
 ELSE grade01 :='F';
END IF;
 DBMS_OUTPUT.PUT_LINE('SCORE '||score01||',GRADE ='||grade01);
END;

Q4.'홍길동1' 세번 출력 하자

DECLARE
 NAME VARCHAR2(10) :='홍길동';
 I   INT :=0;
BEGIN
 FOR I IN 1..3 LOOP
 DBMS_OUTPUT.PUT_LINE(NAME||I);
END LOOP;
END;

Q5.테이블을 생성 해서 반복적인 쿼리,자료를 넣어보자.

CREATE TABLE TEST01(
NO NUMBER(3),
IRUM VARCHAR2(10));

DECLARE

BEGIN
 FOR I IN 1..10 LOOP
 INSERT INTO TEST01 VALUES(I,SYSDATE);
END LOOP;
END;


Q6.구구단 싫지만 해보자 홀수 단만 출력 해보자.

DECLARE
 TOTAL NUMBER := 0;
BEGIN
 FOR I IN 2..9 LOOP
   IF MOD(1,2) != 0 THEN DBMS_OUTPUT.PUT_LINE(I || '단');
    FOR J IN 1..9 LOOP
             TOTAL := I*J;
            DBMS_OUTPUT.PUT_LINE(I||'*'||J||'='||TOTAL);
       END LOOP;
    END IF;
  END LOOP;
END;

Q7.EMP 테이블에서 부서번호 10번인 사원의 평균 급여를 출력하는 익명의 블록을 작성하자.
EX) OOO부서의 평균 급여는 00원 입니다.

DECLARE
    MY_AVG NUMBER(7,2) :=0;
    MY_DEPTNO NUMBER(7) :=10; --MY_DEPTNO EMP.DEPTNO%TYPE :=10;
BEGIN
  SELECT AVG(SAL) INTO MY_AVG
  FROM EMP
  WHERE DEPTNO = MY_DEPTNO
  GROUP BY DEPTNO;
  DBMS_OUTPUT.PUT_LINE(MY_DEPTNO ||'부서의 평균 급여는['||MY_AVG||']원 입니다');
END;

Q8.EMP 테이블에서 20번 부서의 개수,평균 급여를 구하라.
EX) OOO부서의 평균 급여는 OO이고, 사원수는 OO이다.

DECLARE 
  MY_AVG NUMBER(7,2) :=0;
  MY_DEPTNO NUMBER(7) :=20;
  MY_CNT NUMBER(7) :=0;
BEGIN
SELECT COUNT(*),AVG(SAL) INTO MY_CNT,MY_AVG
FROM EMP
WHERE DEPTNO = MY_DEPTNO
GROUP BY DEPTNO;
DBMS_OUTPUT.PUT_LINE(MY_DEPTNO ||'부서의 평균 급여는['||MY_AVG||']원이고,사원의 수는 '||MY_CNT||'명 입니다');
END;

Q9.ACCEPT : 사용자의 입력 값을 읽어서 변수에 저장하는 키워드

사번에 해당 하는 사원의 이름을 출력 하자.

ACCEPT inputVal prompt'사번입력:'

DECLARE 
    NAME1 EMP.ENAME%TYPE;
BEGIN
    SELECT ENAME INTO NAME1 FROM EMP
    WHERE EMPNO=&inputVal;
    DBMS_OUTPUT.PUT_LINE('현재의 결과 : '||NAME1)
END;

Q10.사번을 입력받아 봉급을 100증가 시키자

CREATE OR REPLACE PROCEDURE UPDATE_SAL(V_empno IN NUMBER)
AS 
BEGIN
 UPDATE EMP
 SET SAL  = SAL+100
 WHERE EMPNO = V_EMPNO;
 COMMIT;
END UPDATE_SAL;

Q11.사원의 번호를 입력받아 사원의 번호, 사원의 이름, 사원의 월급을 출력하자.

CREATE OR REPLACE PROCEDURE EXAM01 (RES_EMPNO IN EMP.EMPNO%TYPE)
AS 
    V_EMPNO  EMP.EMPNO%TYPE;
    V_ENAME EMP.ENAME%TYPE;
    V_SAL EMP.SAL%TYPE;
    
BEGIN
    DBMS_OUTPUT.ENABLE;
    SELECT EMPNO,ENAME,SAL INTO V_EMPNO,V_ENAME,V_SAL
    FROM EMP
    WHERE EMPNO = RES_EMPNO;
    DBMS_OUTPUT.PUT_LINE('사원의 번호 : '||V_EMPNO);
    DBMS_OUTPUT.PUT_LINE('사원의 이름 : '||V_ENAME);
    DBMS_OUTPUT.PUT_LINE('사원의 봉급 : '||V_SAL);

END EXAM01;

Q12.함수를 만들어서 연동해보자.

CREATE FUNCTION GET_MYAVG(V_ID IN EMP.EMPNO%TYPE)
RETURN NUMBER
AS
  V_SAL EMP.SAL%TYPE :=0;
  V_TOT NUMBER :=0;
  V_COMM EMP.COMM%TYPE;

BEGIN
    SELECT SAL,COMM INTO V_SAL,V_COMM
    FROM EMP
    WHERE EMPNO = V_ID;
    V_TOT := V_SAL*12 +NVL(V_COMM,0);
    RETURN V_TOT;
END;
/

SELECT EMPNO,GET_MYAVG(7934)
FROM EMP;

좋은 웹페이지 즐겨찾기