쿼리 업데이트 프로시저 0 2 1,705

by 침착맨 [Oracle 기초] 오라클 프로시저 [2022.11.04 10:14:59]


처음.png (2,897Bytes)
두번째.png (3,503Bytes)

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(누적된역할)컬럼이 가운데 값을 지우는 쿼리문을 프로시저로 작성하려고합니다.

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

 

 

by 마농 [2022.11.04 10:18:16]

복잡한 코드 말고 그냥 예시자료로만 설명 가능할까요? 너무 길어서 보기 힘들어요.


by 침착맨 [2022.11.04 10:32:07]

넵 알겠습니다.!

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