调整数据库表中每个VARCHAR列的大小 - Oracle 11g

时间:2012-04-12 19:49:30

标签: sql oracle

我在表VARCHAR中至少有65个A列,我必须从X bytes调整为X char。我希望找到一种比发出ALTER TABLE A MODIFY..命令更简单的方法65次。

任何人都可以帮助我如何做到这一点是一种更快的方法吗?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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编辑器中运行

答案 2 :(得分:2)

Justin的答案部分不正确 - 实际上格罗克斯特更好 - 发现差异:

<强>贾斯汀:

  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!

答案 3 :(得分: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;
/