C#,Delphi,Oracle,MSSQL 개발자블로그

[Oracle/기본]9. 데이터 조작 본문

Programming/Oracle 공부

[Oracle/기본]9. 데이터 조작

19760323 2017. 5. 23. 13:01

※ 이전 단원인 8단원은 SQL PLUS에 관한 내용이므로 생략.

 

- 데이터조작어 DML (Data Manipulation Language)

 

● INSERT INTO table(col1, col2, ...)

           VALUES (val1, val2, ...)

 

☞ NULL 값을 가진 새로운 행 추가

 

   * 암시적 방법 : 열 목록으로부터 열을 생략한다.

     INSERT INTO dept(deptno, dname,   )

           VALUES (60, 'MIS');

 

   * 명시적 방법 : VALUES 목록에 NULL키워드를 명시한다.

     INSERT INTO dept

            VALUES (70, 'FINANCE', NULL);

 

☞ 다른테이블로부터 행 복사

 

   * 서브쿼리로 INSERT 문장을 작성한다.

   * VALUES절을 사용하지 않는다.

   * 서브쿼리의 열과 INSERT절의 열은 값의 개수데이터형이 일치해야 한다.

 

  EX. INSERT INTO managers (id, name, salary, hiredate)

                            SELECT empno, ename, sal, hiredate

                             FROM emp

                           WHERE job = 'MANAGER';

       emp 테이블로부터 데이터를 SELECT해서, managers 테이블에 INSERT시키는 쿼리.

 

UPDATE table

         SET col1 = val1

              ,col2 = val2

              ,col3 = val3 ...

     WHERE ...

 

   ☞ 다중 열 서브쿼리로 갱신

 

      UPDATE emp

           SET (job, deptno) = (SELECT job, deptno

                                        FROM emp

                                      WHERE empno = 7499)

       WHERE empno = 7698;

 

   ☞ 다른 테이블을 근거로 한 행 갱신

 

      UPDATE employee

           SET deptno = (SELECT deptno

                                FROM emp

                               WHERE empno = 7788)

       WHERE job = (SELECT job

                            FROM emp

                           WHERE empno = 7788);

 

DELETE FROM table

             WHERE ...

 

   ☞ 다른 테이블을 근거로 한 행 삭제

    

     DELETE FROM employee

             WHERE deptno = (SELECT deptno

                                       FROM dept

                                      WHERE dname = 'SALES';

 

● 트랜잭션

 

- DDL이나 DCL문장은 자동적으로 커밋된다.

 

* DDL (Data Definition Language)                                               * DCL(Data Control Language)

 

  CREATE                                                                                 SETTRANSACTION

  ALTER                                                                                    COMMIT

  DROP                                                                                    ROLLBACK

  TRUNCATE                                                                             SAVEPOINT

  GRANT

  REVOKE

  COMMENT

 

- DML(INSERT, UPDATE, DELETE)사용 시, 현재 사용자는 SELECT 문장을 사용하여 DML 작업의 결과를 검토할 수 있지만,

  COMMIT이나 ROLLBACK하지 않으면, 다른 사용자는 바뀐 데이터를 볼 수 없다.

- 변경된 행들은 COMMIT이나 ROLLBACK을 하지 않으면, 다른 사용자들은 변경된 행들 내의 데이터를 변경할 수 없다.

 

● 표시자(Marker)로 변경을 롤백

 

SAVEPOINT [이름]

 

- ROLLBACK TO [이름] 을 통해 해당 표시자까지로만 롤백 할 수 있다.

- 트랜잭션을 작은 영역으로 나눌 수 있다.

- 이전의 SAVEPOINT 이름과 똑같은 이름으로 두번 째 SAVEPOINT를 생성한다면, 이전의 SAVEPOINT는 삭제된다.

 

● 잠금 (Locking)

 

동시(concurrent)트랜잭션 사이의 상호작용이 파괴되지 않도록 막아준다.

오라클 데이터베이스에서 Locking은 완전히 자동적이며, 사용자 액션을 요구하지 않는다.(수동으로 잠그는 것 또한  가능)

 

* Lock모드의 종류

- exclusive : 자원이 공유되는 것을 막아준다.

                자원을 배타적으로 lock하는 첫 번째 트랜잭션은 배타적 잠금이 해제되기 전까지는 자원을 변경할 수 있는 유일한

                트랜잭션이다.

                Ex. 내가 변경하고 있으면(내가 첫 트랜잭션임) 다른사람은 내 트랜잭션이 끝나기 전까지 변경할 수 없다.

 

- share lock : 자원이 공유되도록 허용한다.

                 데이터를 읽는 다중 사용자는 데이털를 공유하고, writer(배타적 잠금이 필요한)에 의해 동시에 액세스 되는

                 것을 막기 위해서 공유 잠금을 유지한다. 똑같은 자원상에서 여러개의 트랜잭션은 공유 잠금을 요구할

                 수 있다. 

 

@ 배타적 : 남을 배척하는, 또는 그런 것.

 

 

 

 

Comments