쿼리 업데이트 프로시저(2) 1 3 1,703

by 침착맨 오라클 [2022.11.04 10:33:56]


처음.png (2,897Bytes)
두번째.png (3,503Bytes)
세번째.png (3,471Bytes)
네번째.png (5,562Bytes)

A = 더하기 , D = 지우기

만약에 역할이 3개이상 업데이트 되었을 때 

ex) BUSAN,4|SEOUL,3|DAEJEON,1

ACCU_AUTH(누적된역할)컬럼이 가운데 값을 지우는 쿼리문을 프로시저로 작성하려고합니다.

그 비교문을 어떤 형식을 짜야할지 의견 부탁드립니다.!

by 마농 [2022.11.04 11:09:11]
CREATE TABLE emp7
( eid      VARCHAR2(20)
, auth     VARCHAR2(20)
, acu_auth VARCHAR2(99)
, CONSTRAINT pk_emp7 PRIMARY KEY(eid)
)
;

CREATE OR REPLACE TRIGGER tri_emp7
BEFORE INSERT OR UPDATE OF auth
ON emp7
FOR EACH ROW
DECLARE
    v_gb VARCHAR2(1) := SUBSTR(:NEW.AUTH, -1);
    v_v VARCHAR2(20) := SUBSTR(:NEW.AUTH, 1, LENGTH(:NEW.AUTH)-2);
BEGIN
    IF v_gb = 'A' THEN
        :NEW.acu_auth := :NEW.acu_auth ||'|'|| v_v;
    ELSIF v_gb = 'D' THEN
        :NEW.acu_auth := REPLACE(:NEW.acu_auth, v_v);
        :NEW.acu_auth := LTRIM(RTRIM(REPLACE(:NEW.acu_auth, '||', '|'), '|'), '|');
    END IF;
END;
/

INSERT INTO emp7(eid, auth) VALUES('admin', 'DAEJEON,1,A');
SELECT * FROM emp7 WHERE eid = 'admin';
UPDATE emp7 SET auth = 'SEOUL,3,A' WHERE eid = 'admin';
UPDATE emp7 SET auth = 'BUSAN,3,A' WHERE eid = 'admin';
UPDATE emp7 SET auth = 'BUSAN,3,D' WHERE eid = 'admin';

 


by 마농 [2022.11.04 11:39:58]

이렇게 관리하시는 것보다는 테이블 정규화를 하시기를 권장합니다.


by 침착맨 [2022.11.04 11:43:47]

감사합니다 마농님! 많은걸 배웠습니다!

트리거로 한 번 해보려 했다가 BEFORE가 아닌 AFTER로 해야 하는줄 알고 해보려다 오류가 계속 나서

BEFORE로도 해보다 값이 안바껴서 포기하고 있었는데 많은 도움 감사드립니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입