3

Tableに少なくとも 65VARCHARAあり、サイズを から に変更する必要がありX bytesますX charALTER TABLE A MODIFY..コマンドを65回発行するよりも簡単な方法を見つけたいと思っていました。

これをより速く行う方法を教えてください。

4

4 に答える 4

5

動的 SQL を少し書くことができます。テーブルが現在のスキーマにあると仮定する

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> 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)
于 2012-04-12T19:58:41.467 に答える
4

あなたはそのような醜い何かを試すことができます

 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エディターで実行します

于 2012-04-12T19:59:46.057 に答える
2

ジャスティンの答えは部分的に間違っています-実際、グロクスターの方が優れています-違いを見つけてください:

ジャスティン:

  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%')

Grokster は、すべての列を varchar2 に変換しようとするのではなく、データ型を正しくチェックすることに注意してください!

于 2014-07-08T15:13:36.460 に答える
1
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;
/
于 2013-05-06T20:24:07.830 に答える