2011-06-15 60 views

回答

62

有关Oracle数据库中列的所有元数据均可使用以下某个视图访问。

user_tab_cols; - 用户拥有的所有表格

all_tab_cols; - 对于用户可访问的所有表格

dba_tab_cols; - 用于数据库中的所有表格。

所以,如果你正在寻找像SCOTT.EMP表ADD_TMS一列,并添加只有当它不存在的列时,PL/SQL代码将是沿着这些路线的..

DECLARE 
    v_column_exists number := 0; 
BEGIN 
    Select count(*) into v_column_exists 
    from user_tab_cols 
    where column_name = 'ADD_TMS' 
     and table_name = 'EMP'; 
     --and owner = 'SCOTT --*might be required if you are using all/dba views 

    if (v_column_exists = 0) then 
     execute immediate 'alter table emp add (ADD_TMS date)'; 
    end if; 
end; 
/

如果您打算将其作为脚本运行(不是过程的一部分),最简单的方法是将alter命令包含在脚本中,并在脚本结尾处查看错误(假设您没有Begin-End for剧本..

如果你有file1.sql

和col2是存在的,当脚本运行时,其他两列将被添加到表中,日志会显示错误说“col2”已经存在,所以你应该没问题。

+1

对于欠缺经验的Oracle用户,如果您对列名和表名进行比较,可能会为您节省一些麻烦:'lower(column_name)= lower('mycol')' – mastaBlasta 2018-01-12 19:32:47

6

通常,我会建议尝试ANSI-92标准的元表,但我现在看到Oracle不支持它。

-- this works against most any other database 
SELECT 
    * 
FROM 
    INFORMATION_SCHEMA.COLUMNS C 
    INNER JOIN 
     INFORMATION_SCHEMA.TABLES T 
     ON T.TABLE_NAME = C.TABLE_NAME 
WHERE 
    C.COLLATION_NAME = 'columnname' 
    AND T.TABLE_NAME = 'tablename' 

相反,它像looks你需要做的是这样

-- Oracle specific table/column query 
SELECT 
    * 
FROM 
    ALL_TAB_COLUMNS 
WHERE 
    TABLE_NAME = 'tablename' 
    AND COLUMN_NAME = 'columnname' 

我在那些道歉,我没有一个Oracle实例,验证以上。如果它不起作用,请让我知道,我会删除这篇文章。

+3

或尝试和捕获异常 – Randy 2011-06-15 01:11:20

+7

如果查询'ALL_TAB_COLUMNS'数据字典视图,你要包括在'OWNER'谓语列在多个模式中存在相同表的情况下。如果您知道您只对当前用户模式中的表感兴趣,则应该使用“USER_TAB_COLUMNS”视图。 – 2011-06-15 01:31:34

17

或者,您也可以忽略错误:

declare 
    column_exists exception; 
    pragma exception_init (column_exists , -01430); 
begin 
    execute immediate 'ALTER TABLE db.tablename ADD columnname NVARCHAR2(30)'; 
    exception when column_exists then null; 
end; 
/
+0

很好,很干净。谢谢! – 2016-05-24 11:52:33

+0

甜!这可以用于table_exists吗? – 2017-05-18 20:39:47

+0

不幸的是,没有“table_exists”。 – grokster 2017-06-19 15:24:24

相关问题