如何添加一个简单的检查,然后将一列添加到Oracle数据库的表中?我已经包含了我用来添加列的SQL。如何在将列添加到PL/SQL中的现有表之前检查列是否存在?
ALTER TABLE db.tablename
ADD columnname NVARCHAR2(30);
如何添加一个简单的检查,然后将一列添加到Oracle数据库的表中?我已经包含了我用来添加列的SQL。如何在将列添加到PL/SQL中的现有表之前检查列是否存在?
ALTER TABLE db.tablename
ADD columnname NVARCHAR2(30);
有关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”已经存在,所以你应该没问题。
通常,我会建议尝试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实例,验证以上。如果它不起作用,请让我知道,我会删除这篇文章。
或尝试和捕获异常 – Randy 2011-06-15 01:11:20
如果查询'ALL_TAB_COLUMNS'数据字典视图,你要包括在'OWNER'谓语列在多个模式中存在相同表的情况下。如果您知道您只对当前用户模式中的表感兴趣,则应该使用“USER_TAB_COLUMNS”视图。 – 2011-06-15 01:31:34
或者,您也可以忽略错误:
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;
/
很好,很干净。谢谢! – 2016-05-24 11:52:33
甜!这可以用于table_exists吗? – 2017-05-18 20:39:47
不幸的是,没有“table_exists”。 – grokster 2017-06-19 15:24:24
对于欠缺经验的Oracle用户,如果您对列名和表名进行比较,可能会为您节省一些麻烦:'lower(column_name)= lower('mycol')' – mastaBlasta 2018-01-12 19:32:47