代码之家  ›  专栏  ›  技术社区  ›  RRUZ

规范化Oracle 11g中的列名称

  •  2
  • RRUZ  · 技术社区  · 15 年前

    我需要从我的模式中的许多表中的列名称中删除引号。有什么方法可以使这个过程自动化吗?,Oracle中的任何函数或某个工具,允许我更改删除引号的列的名称。我正在使用Oracle 11g。

    更新

    对不起,我不得不重新措辞我的问题。

    事先谢谢。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Justin Cave    15 年前

    如果只想去掉所有区分大小写的列名

    SQL> create table foo ( "x" number );
    
    Table created.
    
    SQL> ed
    Wrote file afiedt.buf
    
      1  begin
      2    for x in (select *
      3                from user_tab_cols
      4               where column_name != UPPER(column_name))
      5    loop
      6      execute immediate 'ALTER TABLE ' || x.table_name ||
      7        ' RENAME column "' || x.column_name || '"' ||
      8        ' TO ' || upper(x.column_name);
      9    end loop;
     10* end;
    SQL> /
    
    PL/SQL procedure successfully completed.
    
    SQL> desc foo
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
    
     X                                                  NUMBER
    
        2
  •  6
  •   dcp    15 年前

    我假设这里的“字段”是指“列名”。

    请记住,Oracle中的列名不区分大小写,除非在创建表时将它们放在引号中。创建表时,通常不建议在列名周围使用引号。换句话说,如果您像这样创建表:

    CREATE TABLE FOO (
      colUMN1 varchar2(10),
      CoLumn2 number(38)
    )
    

    然后您仍然可以运行如下的select语句:

    SELECT column1, column2 FROM FOO
    

    您也可以这样做:

    SELECT COLUMN1, COLUMN2 FROM FOO
    

    另外请注意,如果运行此查询,您将看到Oracle在数据字典中将列名称存储为大写:

    SELECT * FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'FOO'
    

    所以不需要将这些列全部重命名为大写。您编写的查询可以使用所有大写的列名称(假设表不是使用列名称周围的引号创建的),并且它们可以正常工作。试图强迫他们区分大小写通常是个坏主意。