database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40625 게시물 읽기
No. 40625
프로시져 cursor 오류 질문 입니다.
작성자
고민남
작성일
2014-11-27 10:35
조회수
6,974

안녕하세요

오라클 프로시져에서 cursor에서 테이블명을 조회해서 그 값으로 컬럼들을 조회하는 cursor를 이용해서

insert 문을 만들어서 실행하고 싶은데요. 

아래 procedure 컴파일 오류가 나는데 원인을 잘 못 찾고 있어요. 

cursor  c_list1 에서 오류가 발생합니다. 

아시는 분들의 답변을 주시면 감사하겠습니다. 

 

CREATE OR REPLACE PROCEDURE CUR_TEST(
    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 tab_list 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;                
        
            CURSOR c_list1 IS      
                   SELECT col.column_name AS field ,

count(col.column_name) over( partition by col.table_name ) cnt
                     FROM tab_collist col
                    WHERE .table_name = v_tablist.t_name ;
                     
            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 CUR_TEST;

이 글에 대한 댓글이 총 2건 있습니다.

커서로 조회 해오는 부분 아래에

 

list1  c_list1 %ROWTYPE;

이라고 선언 하신후

c_list1의 컬럼을 불러올때  list1.field

라는 방식으로 해보시면 될 것같습니다.

초보개발자님이 2014-11-27 10:55에 작성한 댓글입니다. Edit

답글 감사합니다.

 

declare   추가

end 추가

해서 컴파일 오류 잡았습니다.

 

고민남님이 2014-11-27 11:31에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40628처음 SQL 하려고 합니다....책 추천좀 부탁드립니다.
초보자
2014-11-28
6507
40627오라클 like 검색조건 [2]
궁금이
2014-11-28
7134
40626질문드립니다 [1]
김윤철
2014-11-27
8151
40625프로시져 cursor 오류 질문 입니다. [2]
고민남
2014-11-27
6974
40624오라클 wm_concat 사용시 결과값이 깨져서 나오는경우 [1]
김정민
2014-11-26
8834
40623[급질문] 정말 어처구니 없는 일이 일어났습니다. [3]
퐝당
2014-11-25
7884
40622sql 질문이염... ㅜㅜ [4]
DB 사랑
2014-11-25
6347
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다