동적쿼리에 대해 문의드립니다. 2 10 3,257

by 허접탱이 [SQL Query] 동적쿼리 [2013.12.16 14:10:43]



안녕하세요.
여태까지 살면서.. 동적쿼리란걸 써볼일이 없어서..어떤식으로 감을 잡아야 할지 몰라..
이렇게 질문글을 올리게 됐습니다.

일단 제가 원하는건 고객정보가 들어있는 테이블에 주민등록번호 필드의 데이터를 일부 마스킹 하고 싶습니다.
예를 든다면..
A와 B 테이블이 존재하며...
A테이블에는 1, 2, 3 번 필드가 존재하는데.. 2번 필드가 주민등록번호 필드이며,
B테이블에는 1, 2, 3 번 필드가 존재하는데.. 1, 3 번 필드가 주민등록 번호 필드 입니다.

A테이블의 2번 필드, B테이블의 1, 3번 필드의 데이터를 아래와 같이 변경을 하고 싶습니다.
변경전 : 1234561111111 -> 변경후 :1234561******

참고적으로 주민등록 번호 필드는 쿼리로 구분을 지어 조회가 가능합니다.
(select table_name, column_name from all_tab_columns where column_name like '%주민번호%')

예전에 샘플로 아래와 같은 쿼리문을 작성하여 해결하곤 했는데..
update 테이블
set 컬럼명 = (select substr(컬럼명, 0,6) || '*******' from 테이블 group by substr(컬럼명, 0,6));
일일이 테이블 명과 컬럼명을 바꿔서 하려니.. 너무 데이터가 많아서.. 힘이드네요.
좋은 답변 및 의견좀 부탁 드리겠습니다.
감사합니다.
by 아발란체 [2013.12.16 14:19:06]
일단 사용 하신 질의는 
"UPDATE 테이블 SET SUBSTR(컬럼명, 1, 6)"으로 수행 해도 동일한 질의가 될 것 같은데 맞나요?


by 아발란체 [2013.12.16 14:58:17]
--맞다면 다음과 같은 방법으로 가능합니다.
CREATE TABLE TEST1 (
  주민등록 VARCHAR2(30)
);

CREATE TABLE TEST2 (
  주민등록 VARCHAR2(30)
);

INSERT INTO TEST1 VALUES('7501011111111');
INSERT INTO TEST1 VALUES('7601011111111');
INSERT INTO TEST2 VALUES('7701011111111');

SELECT table_name, column_name FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME LIKE '%주민등록%';

CREATE OR REPLACE PROCEDURE dynamic_sql_test
IS
 str VARCHAR2(200);
BEGIN
 DBMS_OUTPUT.ENABLE;
 FOR table_list IN
  (SELECT table_name, column_name FROM ALL_TAB_COLUMNS WHERE COLUMN_NAME LIKE '%주민등록%')
 LOOP
  DBMS_OUTPUT.PUT_LINE(table_list.table_name||' Update. '); 
  EXECUTE IMMEDIATE 'UPDATE '||table_list.table_name||' SET '||table_list.column_name||' = SUBSTR('||table_list.column_name||', 1, 6)||''*******''';
 END LOOP;
END;


CALL dynamic_sql_test();

SELECT * FROM TEST2;



by 우리집아찌 [2013.12.16 14:36:12]
update 테이블
set 컬럼명 =  substr(컬럼명, 1,6) || '*******' 

by 허접탱이 [2013.12.16 14:36:35]

아발란체님..
아발란체님께서 생각하고 계신 내용이 맞습니다.
제가 궁금한건 어떻게 하면 테이블 이름과 필드 명이 바뀌면서 주민등록 번호 데이터를 일부 마스킹 할 수 있냐는겁니다.
관심 가져주셔서 감사합니다.

by 우리집아찌 [2013.12.16 14:45:02]
"테이블 이름과 필드 명이 바뀌면서 주민등록 번호 데이터를 일부 마스킹"
위의 질문에는 없는 내용같은데요,, 테이블명의 변경이나 컬럼명 변경이 필요한건가요?



by 마농 [2013.12.16 14:45:36]
SELECT 'UPDATE '||table_name||
       ' SET '||column_name||' = SUBSTR('||column_name||', 1, 7)||''******'';'
  FROM user_tab_columns
 WHERE column_name LIKE '%주민번호%'
;

by 임상준 [2013.12.16 14:47:31]

select
'update '||table_name||' set '||column_name||' = substr('||column_name||', 1, 6)||''********'' ;'
from all_tab_columns
where column_name like '%주민번호%'
;

이거요?

by 우리집아찌 [2013.12.16 14:49:58]

주민번호 전체 테이블 변경이군요..

엑셀 이용하셔도 되긴합니다.

by 허접탱이 [2013.12.16 15:15:59]

우선 답변 주신 많은분들께.. 감사 드립니다.
제가 설명을 잘 못해서.. 답변주신분들께..혼란을 드린거 같습니다.
전체 테이블중 주민번호가 들어있는 필드의 데이터에 대해 업데이트를 하고 싶어서 질문을 드린거였습니다.
그렇기 때문에 테이블 이름과 필드명은 계속 바뀌는거고요..

관심 가져주셔서 감사합니다.^^


by 아발란체 [2013.12.16 16:00:41]
테이블명과 항목명이 바꿔도 업데이트 할 수 있는 방법은 위에 풀이 있습니당 ~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입