프로시저 등록시 에러 발생좀 봐주세요.. 어디구문을 수정해야 될까요?? 0 3 1,607

by 밤나무 [PL/SQL] [2017.02.03 14:08:37]


아래 글에도 올리긴했지만... 프로시저는 만들어서 프로시저를 생성할려고 보니.. 에러가나네요.. 아래 내용좀 봐주세용 ..ㅜㅜ

배경 : 쉐어플렉스 버그가 있어서 데이터가 소스 DB와, 타겟 DB간에 데이터가 일치하지 않는 현상이 있어서.. 조치를 자동화 하라고 프로시저를 만들라는 고객의 요청이 있었습니다..

프로시저내용은 아래와 같이 진행했습니다.

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

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

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

4. insert한 결과값을 잘되었는지 select 합니다.

 아래는 프로시저 내용입니다. 프로시저 등록시 에러가나네용.. 에러내용도 기네요..ㅜㅜㅜ 어디서부터 수정해야될지..어렵네요  ;;;

보시고 수정할곳좀 알려주세요.. 부탁드립니다. 감사합니다.

에러내용 : PL/SQL created with warning 11/10 PLS-00103: 심볼 "SELECT"를 만났습니다 다음중 하나가 기대될 때 :(-+ case mod new not null <식별자> <큰 따옴표로 구분된 식별자> <바인드 변수> continue avg count current exists max min prior sql stddev sum varian execute for all merge time stame interval date<문자 집합 사양을 못하는 문자열 리터럴><번호> <작은 따옴표로 묶인 SQL 문자열> pipe <문자 집합을 지정하여 대체 인용 부호로 묶인 문자열 리터럴> <대체 인용 부호로 묶인 SQL문자열> purge

12/1 PLS-00103:심볼 "V_SQL2"를 만났습니다.

 

create or replace procedure splex_oos_ls3(
v_table_name in varchar2, --테이블명
v_rowid in varchar2)  -- rowid

is
V_SQL1 varchar2(1000);
V_SQL2 varchar2(1000);
V_SQL3 varchar2(1000);

begin
V_SQL1 :=select * from EAP.TEAP01 where rowid=v_rowid ;
V_SQL2 :=select * from WSD.TSD01 where rowid=v_rowid ;
V_SQL3 :=select * from WSD.TSD05 where rowid=v_rowid ;


--첫번째 테이블 삭제, insert
if v_table_name='TEAP01'
 then
 if VSQL1%rowcount =1
then
  delete from ecm.TEAP01 where APPR_DOC_SER in (select APPR_DOC_SER from EAP.TEAP01@SPLEX_CAB_VLS3 where rowid=v_rowid);
  commit;
  insert into ecm.TEAP01 select * from EAP.TEAP01@SPLEX_CAB_VLS3 where rowid=v_rowid;
  select * from ecm.TEAP01 where APPR_DOC_SER in (select APPR_DOC_SER from EAP.TEAP01@SPLEX_CAB_VLS3 where rowid=v_rowid);
 else
DBMS_OUTPUT.PUT_LINE(v_rowid ':rowid 가 존재하지 않습니다.');


--두번째 테이블 삭제, insert
if v_table_name='TSD01'
 then
 if VSQL2%rowcount =1
then
  delete from ecm.TSD01 where (BUB_CD, SA_NO, CR_DAY, WOO_NO) in (select BUB_CD, SA_NO, CR_DAY, WOO_NO from WSD.TSD01@SPLEX_CAB_VLS3 where rowid=v_rowid);
  commit;
  insert into ecm.TSD01 select * from EAP.TSD01@SPLEX_CAB_VLS3 where rowid=v_rowid;
  select * from ecm.TSD01 where (BUB_CD, SA_NO, CR_DAY, WOO_NO) in (select BUB_CD, SA_NO, CR_DAY, WOO_NO from WSD.TSD01@SPLEX_CAB_VLS3 where rowid=v_rowid);
 else
DBMS_OUTPUT.PUT_LINE(v_rowid ':rowid 가 존재하지 않습니다.');

--세번째 테이블 삭제, insert
if v_table_name='TSD05'
 then
 if VSQL2%rowcount =1
then
  delete from ecm.TSD05 where (BUB_CD, SA_NO) in (select BUB_CD, SA_NO from WSD.TSD05@SPLEX_CAB_VLS3 where rowid=v_rowid);
  commit;
  insert into ecm.TSD05 select * from EAP.TSD05@SPLEX_CAB_VLS3 where rowid=v_rowid;
  select * from ecm.TSD05 where (BUB_CD, SA_NO) in (select BUB_CD, SA_NO from WSD.TSD05@SPLEX_CAB_VLS3 where rowid=v_rowid);
 else
DBMS_OUTPUT.PUT_LINE(v_rowid ':rowid 가 존재하지 않습니다.');

    end if ;

   end if;

  end if ;

  end if;

 

 

by 마농 [2017.02.03 14:25:38]

V_SQL1 :=select * from EAP.TEAP01 where rowid=v_rowid ;
이런 구문은 불가능 합니다.
이 다음부터 계속 이상한 구문들이 나오네요.
단순 구문 오류라면 수정 가능하지만...
이건 첫 단추를 잘 못 끼운 것 같네요.
앞선 질문의 jkson 님 답변 방식대로 처음부터 다시 시작하셔야 할 듯.


by jkson [2017.02.03 14:27:32]

너무 많이 틀리셔서..새로 만들어야 할 것 같은데; 일단 저도 업무시간이라.. 간단히 말씀드리면 V_SQL 변수들은 해당 테이블에 건수가 있으면 진행하시려고 하신 거 같은데

V_CNT1 NUMBER;로 하시고

select COUNT(1) INTO V_CNT1 from EAP.TEAP01 where rowid=v_rowid ;

IF V_CNT1 > 0 THEN

이런식으로 체크하셔서 진행하셔야 하고 IF로 열었으면 END IF; 로 닫아야 하는데 짝이 안 맞는 것 같고

BEGIN 은 END IF;로 닫는 게 아니라 END; 로 닫는 겁니다.

COMMIT도 있어야 될 자리에 없는 것도 있네요.

기본적인 문법 공부를 좀 하셔야겠네요.


by 이재호 [2017.02.03 17:02:24]

혹시 위에 내용으로 프로시저 예시를 좀 알려주시면안될까요? 어디서부터 해야될지 막막하네요..ㅜㅜ

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