2012-05-23 4 views
1

Oracle SQL을 사용하는 스키마에서 개인 데이터를 혼란스럽게 할 SQL Developer에서 SQL 스크립트를 개발 중입니다. 이 스크립트는 "OBFUS_TABLE"이라는 테이블을 조사합니다.이 테이블에는 난독 화가 필요한 테이블과 열의 목록이 들어 있습니다. 그런 다음 테이블을 반복하면서 데이터를 변경합니다.동일한 SQL 스크립트에서 테이블 작성 및 읽기

실제 루프 및 난독 처리 프로세스를 테스트했으며 잘 작동합니다. 스크립트 시작 부분을 루프 바로 앞까지 테스트 했으므로 OBFUS_TABLE이 만들어지고 값이 삽입됩니다. 이 문제는 루프를 실행하려고 할 때 "테이블 또는 뷰가 존재하지 않습니다"라는 오류로 실패 할 때 두 개를 함께 시도 할 때 발생합니다. 아래의 코드 스 니펫 :

alter session set current_schema = SYSTEM; 

    DECLARE 
     t_count     NUMBER; 
     t_count2     NUMBER; 
     p_tname     VARCHAR2(100); 
     p_cname     VARCHAR2(100); 
     l_datatype    VARCHAR2(100); 
    BEGIN 

     SELECT COUNT(*) INTO t_count FROM all_tables WHERE table_name = 'OBFUS_TABLE'; 
     SELECT COUNT(*) INTO t_count2 FROM all_tables WHERE table_name = 'OBFUS_LOG'; 

     IF (t_count = 0) 
     THEN 
      EXECUTE immediate 'create table OBFUS_TABLE(TABLENAME VARCHAR2(200 BYTE), COLUMNNAME VARCHAR2(200 BYTE), DATA_TYPE VARCHAR2(20 BYTE), ACTIVE VARCHAR(1 BYTE) )'; 
     END IF; 

     IF (t_count2 = 0) 
     THEN 
      EXECUTE immediate 'CREATE TABLE OBFUS_LOG (SRC_TABLENAME VARCHAR2(50 BYTE), SRC_TABLE_ROW_COUNT NUMBER, COPY_TABLENAME VARCHAR2(50 BYTE), COPY_TABLE_ROW_COUNT NUMBER, UPDATE_DATE TIMESTAMP(6))'; 
     END IF; 

    EXECUTE immediate 'INSERT INTO OBFUS_TABLE VALUES (''OB_MYTABLE1'',''SRNM'',''NAME'',''Y'')'; 
    COMMIT; 


     FOR x IN (SELECT TABLENAME, COLUMNNAME, DATA_TYPE FROM OBFUS_TABLE WHERE ACTIVE='Y') 
     LOOP 
     p_tname := upper(x.TABLENAME); -- Table name 
     p_cname := upper(x.COLUMNNAME); -- Column name 
     l_datatype := upper(x.DATA_TYPE); 
     dbms_output.put_line('Started: '||TO_CHAR(sysdate,'YYYY/MM/DD HH24:MI:SS')); 
     END LOOP; 

    END; 

NB : 실제로 위의 것과 동일한 형식으로 약 30 개의 삽입 문이 있습니다. 나는 그들이이 게시물을 너무 많이 덧댄 것이기 때문에 그것들을 제거했다. 그러나 나는 모든 insert 문을 수동으로 검사했고 모두 정확하다.

SQL Developer가 실행되기 전에 코드에서 "온 전성 검사"를 수행하고 루프를 앞당기 고 OBFUS_TABLE이 존재하지 않는다는 것을 인식하지만 해당 코드 조각을 이해하지 못한다고 가정합니다 OBFUS_TABLE이 확실히 존재합니다.

이 문제를 해결할 방법이 있습니까? 나는 GOTO 성명서가 도움이 될지도 모른다고 생각했지만 행운은 없었습니다. 나는 두 개의 분리 된 스크립트가 아닌 하나의 스크립트로 솔루션을 유지하려고합니다. 그러나이 방법을 사용하는 것이 유일한 방법이라면 제가 가정 할 수 있습니다. 어떤 도움이라도 대단히 감사 할 것입니다.

답변

5

이 같은 선택을위한 동적 SQL을 사용해야합니다

declare 
    ... 
    l_tname varchar2(100); 
    l_cname varchar2(100); 
    l_datatype varchar2(100); 
    rc   sys_refcursor; 
begin 
    ... 
    open rc for 'SELECT TABLENAME, COLUMNNAME, DATA_TYPE 
       FROM OBFUS_TABLE WHERE ACTIVE=''Y'''; 
    loop 
     fetch rc into l_tname, l_cname, l_datatype; 
     exit when rc%notfound; 
     dbms_output.put_line('Started: '||TO_CHAR(sysdate,'YYYY/MM/DD HH24:MI:SS')); 
    end loop; 
    close rc; 
end; 
+0

아! 답변 해 주셔서 감사합니다. 나는 여전히 SQL에 대해 익숙하지 않기 때문에 동적 SQL에 대해 들어 본 적이 없지만 약간의 연구를 수행 할 것입니다. 루프의 코드가 내가 여기서하려고하는 것과 정확히 똑같습니다 : 테이블을 찾고, 필요하다면 그것을 만들고, 읽고 쓰고, 저에게 전혀 문제가 없었습니다. . 코드가 루프에서 구조화되는 방식이어야합니다. 신경 쓰지 마! – Neoptolemus

+0

그래, 좋은 잠자리를 가졌지 만 코드를 작동시킬 수 없어 온라인에서 본 사이트는 조금 더 경험이 많고 코드가 당신과 매우 다른 것처럼 보입니다. 루프가 어떻게 생겼는지 보여 줄 수 있습니까? 코드의 첫 번째 부분에서 무엇을하는지 이해할 수 있지만 rc의 데이터를 루프에 전달하는 데 문제가 있습니다. – Neoptolemus

+0

@Neoptolemus : done –

관련 문제