2013-10-02 2 views
1

여러 열이있는 테이블이 있고 값에서 공백 값 ('')을 제거하고 싶습니다.열 이름으로 루프에서 값을 업데이트하십시오.

update table 
set column_name = trim(both ' ' from column_name) 
where column_name like '% ' 

와 테이블에 55 개 컬럼 주위를 포함하고 있기 때문에 그래서 아마 루프 대신 열 각각의 모든 업데이트 문을 작성하는 실현 가능한 아이디어라고 : 쿼리입니다.

declare 
    column_name varchar2(2048); 
    cursor pointer is 
     select column_name into column_name from user_tab_cols where table_name = 'TABLE_NAME'; 

begin 
    for x in pointer 
    loop 
     dbms_output.put_line(x.column_name); 
    end loop; 
end; 

네,이 작동 : 루프가 작동하는지

먼저 내가 확인. dbms_output 창에 열 이름이 표시됩니다.

declare 
    column_var varchar2(2048); 
    cursor pointer is 
     select column_name into column_var from user_tab_cols where table_name = 'TABLE_NAME'; 

begin 
    for x in pointer 
    loop 
     update table_name 
     set x.column_var = trim(both ' ' from x.column_var) 
     where x.column_var like '% '; 
     commit; 
    end loop; 
end; 

이것은 불행하게도 작동하지 :

지금, 여기 내가 작동하지 않는 것을 시도하고있는 무슨이다. 이 오류는 다음과 같습니다.

ORA-06550: line 11, column 18: 
PLS-00302: component 'COLUMN_VAR' must be declared. 
ORA-06550: line 11, column 16: 
PL/SQL: ORA-00904: "X"."COLUMN_VAR": invalid identifier 
ORA-06550: line 9, column 10: 
PL/SQL: SQL Statement ignored 

어디에서 트랙을 벗어나겠습니까?

답변

1

는이

BEGIN 
     FOR t IN (select column_name from user_tab_cols where table_name = 'MyTable') 
        LOOP 
    EXECUTE IMMEDIATE 
     'update MyTable set '||t.column_name||' = trim(both '' '' from '||t.column_name||') where '||t.column_name||' like ''% '''; 

     END LOOP; 

    END; 

/
동적 SQL을 사용합니다
3

:-) 사전에

덕분에 나는 당신이 실제 열 이름보다는 문에서 열 이름을 나타내는 문자열을 제공 할 필요가 있다고 생각합니다. 즉시 수행하겠습니까?

declare 
    column_var varchar2(2048); 
    cursor pointer is 
     select column_name into column_var from user_tab_cols where table_name = 'TABLE_NAME'; 

begin 
    for x in pointer 
    loop 
     execute immediate 
      'update table_name ' || 
      'set '|| x.column_var ||' = trim(both '' '' from '|| x.column_var ||')'|| 
      'where '|| x.column_var ||' like ''% '''; 
     commit; 
    end loop; 
end; 
관련 문제