--- ○ 데이터 조작어
---- insert, update, delete commit, rollback
---- merge 명령어 : A서버에서 B원격서버에 A서버의 내용을 동기화할때 사용한다.
update emp set ename='백승익'
where ename='KING'

select * from emp
where deptno = 10;
--// 다른 오라클 서버에 연결할 수 있도록 datebase link를 생성한다.
--- 1. 접속할 서버의 net service 명을 생성한다.
--- 2. database link를 생성한다.
create database link boaeoracle
connect to scott identified by lion
using 'FIREWALLBOAE' -- FIREWALLBOAE라는 넷서비스로 연결된 오라클서버에 대해 boaeoracle이라는 이름으로
                     -- 해당 서버에 scott계정에 접속하는 database link를 생성한다.
--/// boaeoracle이 database link 명이다.
select * from emp
where deptno = 10; -- 자신의 로칼 데이타베이스

select * from emp@boaeoracle -- 원격 오라클 서버이다.
where deptno = 10; -- 생성한 다른 오라클 서버 데이타베이스 자료 출력
------ 새로운 테이블 생성 ------
create table reservation
(reservno number, name varchar2(10)
,tel varchar2(13)
,constraint reservation_reservno_pk primary key(reservno)) tablespace users

select *from reservation;

select *from reservation@boaeoracle;
--- merge 사용하기
insert into reservation values(1,'백승익','010-6275-2735');

merge into reservation@boaeoracle R
using reservation L
on (L.reservno = R.reservno)  -- 로컬서버 자료와 원격서버 자료와 동일한게 있는지 여부 묻기
               -- 반드시 고유한 컬럼으로 정해야 한다.
when matched then                           -- 동일하다면 다음 자료로 업데이트 해라
  update set R.name=L.name, R.tel=L.tel
when not matched then                       -- 동일하지 않다면 다음 값을 넣어라
  insert(reservno, name, tel)
  values(L.reservno, L.name, L.tel);
--/// on 조건에 match되면 matched then 다음을 실행하고 (업데이트)
--              match가 안되면 not matched then 다음을 실행하게 된다. (새로운값 입력)
 
insert into reservation values(2,'이영애','011-6275-8699'); -- merge 실행

update reservation set name='이미자', tel='018-777-8974'
where reservno=2; -- merge 실행
-----------------------------------------------------------------------------------------
create table empcopy
tablespace users
as select * from emp;

select * from empcopy;
---- delete : 해당 부분을 삭제 한다.
delete empcopy where deptno=30;
---- rollback : commit한 이후로 실행되어진 DML(insert, update, delete, merge)의 명령을 취소한다.
---- commit : DML문장의 명령을 적용시킨다.
---- merge : DML문을 실행시키면 실행되어진 DML문의 해당행은 자동으로 Exclusive lock(배타적잠금)이 걸린다.
update empcopy set comm=120 where deptno=20;
    -- 현문장은 아직까지  commit이나 rollback을 하지 않은 상태이다. 그러므로 deptno가 20번인 행들은
    -- 배타적 잠금이 걸린다. 그래서 다른 세션에서는 deptno20번인 행들을 update하기전의 값으로
    -- select는 가능하지만 deptno 20번인 행들은 DML문을 할 수가 없다. 대기상태에 빠진다.
    -- 그러나 원래세션에서 update한 문장(모든DML)을 commit이나 rollback하면 대기상태에 빠진 다른
    -- 세션에서 실행한 DML문장은 대기상태에서 빠져나와 자동으로 실행되어진다.

 --// 그래서 잠금(lock)의 종류는 2가지가 있다. 첫번째가 방금해본 exclusive lock(배타적 잠금)이고
 --// 두번재가 share lock(공유잠금)이 있다.
 --// exclusive lock(배타적 잠금)는 DML문장을 했을때 DML문장을 실ㄹ행한 세션에서 Commit이나
 --// Rollback문을 해야만 다른 세션에서 잠금이 풀리어 또 다른 DMl문장을 할 수 있는 것이고
 --// share lock(공유잠금)은 select 문을 했을때 결과물 데이터가 완료되어 추출되기전까지
 --// 자동적으로 해당 테이블이 잠기는 것을 말한다. 하지만 select 결과물이 나오기만 하면
 --// 자동적으로 share lock(공유잠금)은 풀립니다.
 
 --// 그렇다면 select 되어진 데이터를 계속해서 잠금유지상태를 원하고자 한다면 어떻게 할까?
 --// 예를들어 은행에서 돈을 인출할때 조회후 인출과 같은 경우이다.
create table saving
(geno number, jango number, constraint saving_geno_pk primary key(geno)) tablespace users;

insert into saving values(1,2000);
insert into saving values(2,3000);

select * from saving;
----- 잔고가 얼마 있는지 조회후 인출을 하려고 한다.
----- 즉, 먼저 select를 한다음에 update를 하려고 한다.
select jango
from saving
where geno=1;

update saving set jango=jango-500     /* 다른곳에서 update saving set jango=jango-2000 where geno=1; */
where geno=1                          /* 을 했다면 돈이 빠지지 않게된다. */
------- 그럼 조회하면서도 잠금을 유지 하려면 다음과 같이 한다.
select jango
from saving
where geno=1
for update;   /* 이렇게 하게되면 commit이나 rollback을 하기전까진 다른곳에서 자료 변경이 안된다. */

Posted by Duritz

공지사항

Yesterday
Today
Total
12-05 02:20

달력

 « |  » 2024.12
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