프로시져 cursor 질문입니다 0 2 6,898

by 김현곤 [PL/SQL] Cursor [2014.11.27 10:20:09]


 

안녕하세요 오라클 프로시져를 만들고 있어요 먼저 테이블 리스트를 조회하는 cursor를 만들고 c1 에서 첫번째 테이블명을 가지고 온값으로 두번째로 테이블의 컬럼리스트를 조회하는 cursor를 c2 를 만들어서 select insert문을 만들어서 c1 테이블의 리스트만큼 insert를 하고 싶어요 컴파일 오류가 pls-00103 encountered the symbol c2 when expecting one of the following 이라고 나오네요 회사 pc로 접속이 안되어서 스마트폰으로 등록을 해서 소스 올리기가 어렵네요

이제 접속이 되네요.

CREATE OR REPLACE PROCEDURE MIG_TEST02(
    V_COL_NAME IN VARCHAR2
)IS    
    V_SQL        long ;
    V_SQL2       long ;
    
CURSOR c_tablist IS
       select col01 as t_name , col02 as col_name from test_mig02 WHERE col02 = V_COL_NAME ;
                  
BEGIN           
 
        FOR v_tablist in c_tablist
        LOOP
 
        DBMS_OUTPUT.PUT_LINE(v_tablist.t_name);
        
        V_SQL2:= 'DELETE FROM '||v_tablist.t_name||' WHERE '||V_COL_NAME||' in(''506'')';
        EXECUTE IMMEDIATE V_SQL2;                
        commit;    
       
         DECLARE CURSOR c_list1 IS      
                   SELECT col.column_name AS field , count(col.column_name) over( partition by col.table_name ) cnt   
                     FROM all_tab_columns col,      
                          all_col_comments cmmnts      
                    WHERE col.owner = cmmnts.owner      
                          AND col.table_name = cmmnts.table_name  
                          AND col.column_name = cmmnts.column_name  
                          AND col.table_name = v_tablist.t_name
                    ORDER BY COLUMN_ID ASC;
                    
            BEGIN
 
                V_SQL := 'INSERT INTO '||v_tablist.t_name||' SELECT ';    
                
                for v_list1 in c_list1
                loop    
                  if v_list1.cnt <> c_list1%ROWCOUNT then
                    if v_list1.field = V_COL_NAME then
                       V_SQL := V_SQL|| 'DECODE('||V_COL_NAME||',''502'',''506'','||V_COL_NAME||') AS '||V_COL_NAME||' ,' ;           
                    else
                    V_SQL := V_SQL|| v_list1.field || ', '; 
                    end if;
                  else 
                    V_SQL := V_SQL|| v_list1.field ;    
                  end if;
                END loop;        
                  
              V_SQL := V_SQL || ' FROM '||v_tablist.t_name||' WHERE '||V_COL_NAME||' IN( ''502'' ) ' ;                  
                 
               dbms_output.enable(1000000);  
               --DBMS_OUTPUT.PUT_LINE ( V_SQL );           
               
               EXECUTE IMMEDIATE V_SQL;     
               
               COMMIT;   
       
       END LOOP;
                  
    
EXCEPTION    
     WHEN OTHERS THEN    
          DBMS_OUTPUT.PUT_LINE (SQLERRM);    
END MIG_TEST02;

오류가 아래처럼 나오네요.

PROCEDURE created with compilation error.
61/1  PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following:

   begin case declare end exit for goto if loop mod null pragma
   raise return select update while with <식별자>
   <큰 따옴표로 구분된 식별자> <바인드 변수> <<
   close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe

 

 

 

 

 

 

by 부쉬맨 [2014.11.27 10:40:17]
select * from ALL_ERRORS
where type = 'PROCEDURE'
and name = '프로시저명'

으로 몇번째 라인이 에러가 낫는지 확인하시면서 찾으셔야됨

콤마나 세미콜로등이 빠져서 난에러임


by 마농 [2014.11.27 11:01:36]

BEGIN 은 두개인데 END 는 하나 뿐이네요.
메인 블럭(Begin~End) 안의 서브블럭을 종료시켜주셔야 합니다.
COMMIT; 과 END LOOP; 사이에 END; 가 필요합니다.

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