디비 링크
인스톨된 오라클1, 오라클2를 .. 연결..
물리적으로 다르게 install 된 2개 이상의 db를 연결..
2개의 connection 으로 하는게 아니라..하나의 connection으로.. 조인 및 기타 쿼리 실행 가능...
스냅샷도 포함이 되는데 잘 쓰이지는 않는다.
시퀀스
CREATE SEQUENCE NCCJST2011.SQ_BUS_BUS_MST
START WITH 13201
MAXVALUE 9999999
MINVALUE 1
NOCYCLE
CACHE 20
NOORDER;
시퀀스는 자동증가해서 증가한 값을 리턴해줌..
이름.nexval() 인가.. 하나 증가 시킨 값을 리턴..
nextval()
다음 이쿼리는 트리거에 시퀀스를 적용한 예
CREATE OR REPLACE TRIGGER LOCAL.TRG_CATE_INFO_01
BEFORE INSERT
ON LOCAL.CATE_INFO
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
BEGIN
:New.cateno := SQ_CATE_INFO_CATENO.nextval;
END TRG_CATE_INFO_01;
/
이렇게 되면 insert 시 자동 증가하는 필드구성가능...
트리거
트리거는 해당 테이블이 insert , update, delete 될 경우에 어떤일을 하라라고 정의하는 거라고 보면 된다..
insert , delete , update 시에 공통적으로 해야 될 db 작업을 실행가능..
남용하지 말기 -> 간단한 작업에 유용하다.
백그라운드가 아니라서 속도 저하의 원인이 되기도 한다.
예를 들어 시스템 구성 상 아무 문제 없는데 느리다고 할 경우..
DROP TRIGGER SCOTT.TRG_UPDATE;
// 이름 정의
CREATE OR REPLACE TRIGGER SCOTT.TRG_UPDATE
// INSERT 되기 전에
BEFORE INSERT ON SCOTT.TRG_UPDATE2 FOR EACH ROW
BEGIN
// 새로 생기는 ROW에 SEQNO 라는 필드에 시퀀스의 값을 넣으라는 것
// BEGIN 과 END 사이에 쿼리, 프로시져, 펑션도 넣을 수 있음!!
:new.SeqNo := SQ_TRG_UPDATE2.nextval;
END TRG_UPDATE;
/
BEFORE / AFTER / COMPOUND 의 차이점
트랜잭션의 전/후를 나타낸다.
begin ~ end 사이에 문장을 .. update, delete, insert 전에 해라..... 아니면 후에 실행...
COMPOUND는 혼용인데 많이 쓰이지 않는다.
보통은 INSERT, UPDATE는 AFTER를
DELETE는 BEFORE를 많이 쓴다.
트리거 예제
트리거 활용한다면 apt_info 에 전체 가격이 있다면..
호의 가격이 변동이 될때마다.. apt_info 전체 가격을 update 하는 트리거가 있음 좋을듯..
물론.. ho_info 의 가격이 update, insert 후가 되겠죠...
그렇게 되면 가격이 source 에서 매번 돌리지 않아도.. 자동으로 가격이 동기화 되겠죠..
delete 도 해야 되겠네요..
우선 APT_PRICE를 담을 필드를 추가
ALTER TABLE APT_INFO ADD (TOTAL_HO_PRICE NUMBER(19, 3) DEFAULT 0);
CREATE OR REPLACE TRIGGER SCOTT.TRG_UPDATE_APT_PRICE
AFTER INSERT OR UPDATE ON SCOTT.HO_INFO FOR EACH ROW
DISABLE
BEGIN
UPDATE SCOTT.APT_INFO A SET TOTAL_HO_PRICE =
(SELECT SUM(H.PRICE) FROM SCOTT.HO_INFO H WHERE A.APT_CODE = H.APT_CODE);
END;
/
그러나.. 에러발생..
우선 DISABLE -> 삭제..
그리고 해당 TRIGGER가 데이터 입력 시에나 갱신된 후에 작동을 하므로..
작동하는 동안에는 SUM함수에서 계속 에러가 발생한다.
그래서 다른 방법으로 해결..
DROP TRIGGER SCOTT.TRG_UPDATE_APT_PRICE;
CREATE OR REPLACE TRIGGER SCOTT.TRG_UPDATE_APT_PRICE
AFTER UPDATE
ON SCOTT.HO_INFO
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
UPDATE SCOTT.APT_INFO A
SET A.TOTAL_HO_PRICE = TOTAL_HO_PRICE - :OLD.PRICE + :NEW.PRICE
WHERE A.APT_CODE = :OLD.APT_CODE;
END TRG_UPDATE_APT_PRICE;
/
들어오는 데이터값에서 기존의 PRICE 값은 삭제하고 새로 들어온 PRICE 값이 변경되므로
APT_PRICE값에 빼주고, 더해준다.
'Study > Oracle' 카테고리의 다른 글
[Oracle] SQL LOADER , 테이블 중복 데이터 체크 (0) | 2019.05.20 |
---|---|
[Oracle] 파일 읽고 쓰기 (0) | 2019.05.20 |
[Oracle] GRANT 권한부여 (0) | 2019.05.20 |
[oracle] 프로시저 수식, 문자연결 수식, 대입연산자, cursor, for-loop exit, INSERT FOR LOOP, exception (0) | 2019.05.20 |
[oracle] CREATE, PROCEDURE (0) | 2019.05.14 |