2009. 3. 14. 03:23 Program.../Oracle
Oracle 데이터 조작어(insert, update, delete commit, rollback)
--- ○ 데이터 조작어
---- 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을 하기전까진 다른곳에서 자료 변경이 안된다. */
'Program... > Oracle' 카테고리의 다른 글
Oracle constraint(제약조건) (0) | 2009.03.14 |
---|---|
Oracle 유저 생성,삭제 및 테이블, 테이블스페이스 생성, 삭제 (0) | 2009.03.14 |
Oracle 서브상관쿼리, exists, not exists (0) | 2009.03.14 |
Oracle 서브쿼리(SubQuery) (0) | 2009.03.14 |
Oracle sum() over() - 누적계산 (0) | 2009.03.14 |