create table emp7(
EID varchar2(100),
AUTH varchar2(100),
ACCU_AUTH varchar2(100)
);
처음 업데이트 한 번 했을때
UPDATE EMP7
SET AUTH = 'DAEJEON,1,A',
ACCU_AUTH = CASE WHEN ACCU_AUTH IS NULL THEN REGEXP_SUBSTR('DAEJEON,1,A', '[^,]+', 1,1) || ',' || REGEXP_SUBSTR('DAEJEON,1,A','[^,]+' ,1,2)
WHEN ACCU_AUTH IS NOT NULL THEN
CASE WHEN 'DAEJEON,1,A' NOT LIKE '%,D%' THEN REGEXP_SUBSTR('DAEJEON,1,A', '[^,]+', 1,1) || ',' || REGEXP_SUBSTR('DAEJEON,1,A','[^,]+' ,1,2) || '|' || ACCU_AUTH
WHEN 'DAEJEON,3,D' LIKE '%,D%' THEN REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,2) || '|' || REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,3)
END
END
WHERE EID = 'admin';
업데이트 두번째 했을 때
UPDATE EMP7
SET AUTH = 'SEOUL,3,A',
ACCU_AUTH = CASE WHEN ACCU_AUTH IS NULL THEN REGEXP_SUBSTR('DAEJEON,1,A', '[^,]+', 1,1) || ',' || REGEXP_SUBSTR('DAEJEON,1,A','[^,]+' ,1,2)
WHEN ACCU_AUTH IS NOT NULL THEN
CASE WHEN 'SEOUL,3,A' NOT LIKE '%,D%' THEN REGEXP_SUBSTR('SEOUL,3,A', '[^,]+', 1,1) || ',' || REGEXP_SUBSTR('SEOUL,3,A','[^,]+' ,1,2) || '|' || ACCU_AUTH
WHEN 'SEOUL,3,A' LIKE '%,D%' THEN REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,2) || '|' || REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,3)
END
END
WHERE EID = 'admin';
계속 바뀌는 부분을 프로시저로 만들었습니다.
CREATE OR REPLACE PROCEDURE UPDATE_EMP7
(
P_EID IN EMP7.EID%TYPE,
P_AUTH EMP7.AUTH%TYPE,
P_ACCU_AUTH EMP7.ACCU_AUTH%TYPE
)
IS
BEGIN
UPDATE EMP7 SET AUTH = P_AUTH,
ACCU_AUTH = CASE WHEN ACCU_AUTH IS NULL THEN REGEXP_SUBSTR(P_ACCU_AUTH, '[^,]+', 1,1) || ',' || REGEXP_SUBSTR(P_ACCU_AUTH,'[^,]+' ,1,2)
WHEN ACCU_AUTH IS NOT NULL THEN
CASE WHEN P_ACCU_AUTH NOT LIKE '%,D%' THEN ACCU_AUTH || '|' || REGEXP_SUBSTR(P_ACCU_AUTH, '[^,]+', 1,1) || ',' || REGEXP_SUBSTR(P_ACCU_AUTH,'[^,]+' ,1,2)
-- WHEN ACCU_AUTH LIKE '%,D%' THEN REGEXP_SUBSTR(P_ACCU_AUTH, '[^|]+', 1,2) || '|' || REGEXP_SUBSTR(P_ACCU_AUTH, '[^|]+', 1,3) --
WHEN P_ACCU_AUTH LIKE '%,D%' AND LENGTH(ACCU_AUTH) < 20 THEN REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,1) -- 역할 2개에서 1개 여기서 앞에값을 지울지 뒤에값을 지울지?
WHEN P_ACCU_AUTH LIKE '%,D%' AND LENGTH(ACCU_AUTH) < 30 THEN REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,1) || '|' || REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,2) -- 3개에서 2개A
WHEN P_ACCU_AUTH LIKE '%,D%' AND LENGTH(ACCU_AUTH) < 40 THEN REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,1) || '|' || REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,2) || '|' || REGEXP_SUBSTR(ACCU_AUTH, '[^|]+', 1,3)-- 4개에서 3개
END
END
WHERE EID = P_EID;
END UPDATE_EMP7;
EXEC UPDATE_EMP7('admin', 'DAEJEON,1,A','DAEJEON,1,A');
EXEC UPDATE_EMP7('admin', 'SEOUL,2,A','SEOUL,2,A');
A = 더하기 , D = 지우기
만약에 역할이 3개이상 업데이트 되었을 때
ex) BUSAN,4|SEOUL,3|DAEJEON,1
ACCU_AUTH(누적된역할)컬럼이 가운데 값을 지우는 쿼리문을 프로시저로 작성하려고합니다.
그 비교문을 어떤 형식을 짜야할지 의견 부탁드립니다.!