2012-04-12 2 views

答えて

5

動的SQLを少し書くことができます。表は、あなたがその

select 'ALTER TABLE '||table_name| 
     ' MODIFY ('||column_name||' VARCHAR2('||char_length||' char));' 
    from all_tab_cols 
    where table_name='A' and 
     datatype like 'VARCHAR2%'; 

コピーのような結果グリッドを醜い何かをしようとし、それを貼り付けることができ

SQL> ed 
Wrote file afiedt.buf 

    1 create table foo(
    2 col1 varchar2(10 byte), 
    3 col2 varchar2(20 byte) 
    4*) 
SQL>/

Table created. 

DECLARE 
    l_sql_stmt VARCHAR2(1000); 
BEGIN 
    FOR t IN (SELECT * FROM user_tab_cols WHERE table_name = 'FOO') 
    LOOP 
    l_sql_stmt := 'ALTER TABLE foo MODIFY (' || 
        t.column_name || ' varchar2(' || t.char_length || ' char))'; 
    EXECUTE IMMEDIATE l_sql_stmt; 
    END LOOP; 
END; 


SQL> desc foo; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
COL1            VARCHAR2(10 CHAR) 
COL2            VARCHAR2(20 CHAR) 
4

の下に作業を参照してくださいすることができ、現在のスキーマ

DECLARE 
    l_sql_stmt VARCHAR2(1000); 
BEGIN 
    FOR t IN (SELECT * FROM user_tab_cols WHERE table_name = 'A') 
    LOOP 
    l_sql_stmt := 'ALTER TABLE ' || t.table_name || ' MODIFY (' || 
        t.column_name || ' varchar2(' || t.char_length || ' char))'; 
    EXECUTE IMMEDIATE l_sql_stmt; 
    END LOOP; 
END; 

であると仮定すると、 SQLエディタで実行します。

+0

私はすべてのDBMSで動作し、それぞれに固有の手続き型拡張に依存しないので、この手法が気に入っています。多くの場合、これをいくつかのスプーリング機能と組み合わせて、新しいSQLスクリプトを作成して実行することができます。 –

0
BEGIN 
    FOR x IN (SELECT * FROM user_tab_cols WHERE table_name = 'A' AND datatype LIKE 'VARCHAR%') 
    LOOP 
     EXECUTE IMMEDIATE 'ALTER TABLE '||x.table_name||' MODIFY '||x.column_name ||' VARCHAR2('||x.char_length||' CHAR)'; 
    END LOOP; 
END; 
/
+2

これは2年前のジャスティンの受け入れられた答えとどう違いますか? –

+0

それはありません。私は、少ないコードで同じ結果が得られることを示しています。それは洗練されたものです。 – grokster

1

ジャスティンの答えは、部分的に間違っている - の違いを見つける - 実際のグロックスターの方が良いに:

ジャスティン:

FOR t IN (SELECT * FROM user_tab_cols WHERE table_name = 'A') 

グロックスター:グロックスターがデータ型をチェックすること

FOR x IN (SELECT * FROM user_tab_cols WHERE table_name = 'A' AND datatype LIKE 'VARCHAR%') 

お知らせすべての列をvarchar2に変換しようとするのではなく、正しく!

関連する問題