프로시저 질문드립니다. 0 4 892

by 밤나무 [PL/SQL] 꼭좀 부탁드립니다 ㅠㅠ [2017.02.02 19:51:20]


안녕하세요. 매일 눈팅만 하다가.. 프로시저 짜는데 너무 막혀서.. 글을 올려봅니다.

저희고객 사이트에 DB복제 솔루션(쉐어플렉스)를 사용하고 있습니다. 쉐어플렉스 버그가 있어서 데이터가 소스 DB와, 타겟 DB간에 데이터가 일치하지 않는 현상이 있어서.. 조치를 자동화 하라고 프로시저를 만들라는 고객의 요청이 있었습니다..

조치 방법방법은 아래와 같이 진행합니다.

1. 쉐어플렉스 에러로그에  DB의 데이터가 맞지 않는 테이블의 소스DB 테이블의 rowid가 에러로그에 남습니다.

2.  소스쪽 테이블의 PK 컬럼을 조회해서 에러가 난 rowid로 소스쪽 db에서 테이블의 pk컬럼을 조회하여 타겟 db에 해당 row를  delete 합니다.

3. delete한 값을 소스쪽 내용으로 insert 합니다.

소스, 타겟간의 DB는 DB Link가 걸려있어서 타겟에서 조회하고, 삭제 하는데는  문제가 없습니다.소스 타겟간에 데이터가 종종 맞지가 않아서.. 수작업으로 작업하기에는 양이 너무 많습니다. ㅠㅠ 고객이  그래서 프로시저로 등록 해서 자동화를 구현하고하라고 하는데.. 구현이 쉽지가 않네요..ㅜㅜㅜ

 몇시간동안 낑낑대며,, 작성은하고 있는데.. 더이상 막혀 진행이 어려워 글을 올려봅니다. 도와주십시요..ㅜㅜ

아래는 프로시저 내용입니다.

create or replace procedure splex_oos_ls1(

v_tablename in varchar2,

rowid in varchar2)

is

declare

v_owner varchar2(100); --테이블 소유자

v_key    varchar2(100); --pk 컬럼

v_server  varchar2(100); -- db link명

v_col_list varchar2(10000); -컬럼리스트

 

cursor c_pk is

select c.column_name from dba_cons_columns@SPLEX_CAB_LS1 c, dba_constraints@SPLEX_CAB_LS1 s

where c.constraint_name=s.constraint_name and s.constraint_type='P'

and c.table_name=v_tablename; -- 이값은 입력된 테이블 값

 

cusor c_col is -- 해당테이블 row 삭제

delete from ecm.v_tablename where v_key=(select v_key from v_owner.v_tablename where rowid=v_rowid)

-- v_key pk 컬럼을 넣어야되는데요.. pk컬럼이 하나가 아니고 4개입니다. where 조건에 and 로 계속 달아야될거 같은데 테이블마다 pk 컬럼이 달라서.. 하드코딩해서 박을수도 없네요.. 변수로 가져와야 될거 같은데.. 그게 어렵네요 ㅜㅜ 어떻게 구현해야될지..꼭 답변 부탁드립니다...

읽어주셔서 감사합니다.

 

 

 

by jkson [2017.02.03 10:02:16]

동적쿼리로 해결하셔야할 것 같구요. 삭제하는 것까지만 sample로 작성해봤습니다. 참고하셔서 작성해보세요.

declare
v_key varchar2(100);
v_tablename varchar2(100);
v_sql varchar2(4000);
v_rid varchar2(100);
begin
    v_tablename := '테이블명';
    v_rid := 'AAA2n6AAuAAAACBAAA';
    
    select listagg(column_name,',') within group(order by position) 
      into v_key
      from dba_cons_columns c, dba_constraints s
     where c.constraint_name=s.constraint_name and s.constraint_type='P'
       and c.table_name= v_tablename;

    v_sql := 'delete from ' || v_tablename 
          || ' where (' || v_key 
          || ') = (select ' || v_key || ' from ' || v_tablename || ' where rowid = :rid)';
    
    execute immediate v_sql using v_rid;
    commit;
exception
    when others then
        dbms_output.put_line('error : ' || sqlerrm);    
end;




 


by 밤나무 [2017.02.03 13:57:35]

정말 감사드립니다. 이방법을 통해서 해보려니 이해하는데 조금 시간이 걸리는 관계로..ㅎㅎ 하드코딩해서 쓸수있는 방법을 찾았습니다. 다음에시간될때 이방법을 꼭 써봐야겟네요.. 정말 감사드립니다.

 


by 마농 [2017.02.03 14:08:22]

해결 방법 공유 부탁드려요.


by jkson [2017.02.03 14:14:42]

저도 하드코딩으로 어떻게 하셨는지 궁금하네요.

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