2010-05-14 3 views
4

Oracle 10g에서는 PL/SQL에서 다음을 수행 할 수 있습니까?문자열 형식의 모든 테이블에서 모든 행의 모든 ​​열을 잘라내는 방법은 무엇입니까?

for each table in database 
    for each row in table 
    for each column in row 
     if column is of type 'varchar2' 
     column = trim(column) 

고마워요!

+2

는 USER_TABLES에서보세요 http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/statviews_5443.htm 및 USER_TAB_COLUMNS http://download.oracle .com/docs/cd/B28359_01/server.111/b28320/statviews_5429.htm # REFRN26277 시스템 테이블. 나는 당신이 원하는 것을하기 위해 동적 질의를 공식화 할 수 있어야한다고 생각합니다. –

+0

유용한 질문! ;-) – UltraCommit

+0

@ pm_2 제안에 대해 대단히 감사합니다. 아래에있는 사람들이 한 것처럼 보입니다. – daveslab

답변

6

물론 대규모 동적 업데이트를 수행하는 것은 잠재적으로 위험하고 시간이 오래 걸릴 수 있습니다. 그러나 원하는 명령을 생성하는 방법은 다음과 같습니다. 이것은 하나의 스키마를위한 것이며 명령을 작성하여 출력합니다. 실행하기 전에 스크립트에 복사하여 검토 할 수 있습니다. 또는 dbms_output.put_line(...)에서 EXECUTE IMMEDIATE ...으로 변경하여이 스크립트가 생성 된 모든 명령문을 실행하도록 할 수 있습니다.

SET SERVEROUTPUT ON 

BEGIN 
    FOR c IN 
    (SELECT t.table_name, c.column_name 
     FROM user_tables t, user_tab_columns c 
     WHERE c.table_name = t.table_name 
     AND data_type='VARCHAR2') 
    LOOP 

    dbms_output.put_line(
         'UPDATE '||c.table_name|| 
         ' SET '||c.column_name||' = TRIM('||c.column_name||') WHERE '|| 
         c.column_name||' <> TRIM('||c.column_name||') OR ('|| 
         c.column_name||' IS NOT NULL AND TRIM('||c.column_name||') IS NULL)' 
        ); 
    END LOOP; 
END; 
+2

USER_TAB_COLUMNS에는 테이블과 뷰에있는 열이 있습니다. 이 작업을 수행하려면보기를 필터링해야합니다. – Allan

+1

데이터베이스에 VARCHAR2 유형의 열이있는 많은 테이블이 포함되어있는 경우 dbms_output.put_line의 버퍼가 모든 UPDATE 문을 포함하기에 충분하지 않으므로 INSERT를 사용하여 Oracle 테이블에 UPDATE 문을 저장하는 것이 편리합니다 문을 DBMS_OUTPUT.PUT_LINE 문 대신 사용하십시오. – UltraCommit

+1

닭고기,하지만 다시는 내 테이블에 대한 몇 가지, 난 그냥 출력 버퍼를 증가, 그리고 괜찮 았어. – daveslab

3

아마도 데이터베이스가 아닌 스키마의 모든 열에 대해이 작업을 수행하려고 할 것입니다. 사전 테이블에이 작업을 수행하려고하면

declare 
    v_schema varchar2(30) := 'YOUR_SCHEMA_NAME'; 
    cursor cur_tables (p_schema_name varchar2) is 
    select owner, table_name, column_name 
    from all_tables at, 
     inner join all_tab_columns atc 
     on at.owner = atc.owner 
      and at.table_name = atc.table_name 
    where atc.data_type = 'VARCHAR2' 
     and at.owner = p_schema; 
begin 
    for r_table in cur_tables loop 
    execute immediate 'update ' || r.owner || '.' || r.table_name 
     || ' set ' || r.column_name || ' = trim(' || r.column_name ||');'; 
    end loop; 
end; 

는 처음에 VARCHAR2s입니다 필드 작동합니다 ... 좋은 생각이 될 것입니다. 데이터베이스에 CHAR 필드가 있으면 CHAR 필드가 항상 최대 길이로 채워지기 때문에 운이 없어진 것입니다.

관련 문제