在Oracle中更改表时捕获异常

时间:2012-02-02 16:09:13

标签: sql oracle alter-table

我正在尝试在Oracle中编写一个命令,根据列是否已经存在而对列进行ADD或MODIFY。基本上是这样的:

BEGIN

  ALTER TABLE MY_TABLE ADD ( COL_NAME VARCHAR2(100 );

  EXCEPTION WHEN OTHERS THEN
    ALTER TABLE MY_TABLE MODIFY ( COL_NAME VARCHAR2(100) );

END;

但是,Oracle抱怨在BEGIN中有ALTER命令。有没有办法在Oracle中使用单个SQL命令实现此目的?

谢谢!

2 个答案:

答案 0 :(得分:6)

为了将DDL放在PL / SQL块中,您需要使用动态SQL。

就个人而言,我会先检查列是否存在然后发出DDL。像

这样的东西
DECLARE
  l_cnt INTEGER;
BEGIN
  SELECT COUNT(*)
    INTO l_cnt
    FROM dba_tab_cols
   WHERE table_name  = 'MY_TABLE'
     AND owner       = <<owner of table>>
     AND column_name = 'COL_NAME';

  IF( l_cnt = 0 )
  THEN
    EXECUTE IMMEDIATE 'ALTER TABLE my_table ADD( col_name VARCHAR2(100) )';
  ELSE
    EXECUTE IMMEDIATE 'ALTER TABLE my_table MODIFY( col_name VARCHAR2(100) )';
  END IF;
END;

如果您无法访问DBA_TAB_COLS,则还可以使用ALL_TAB_COLSUSER_TAB_COLS,具体取决于表所在的架构以及您在桌面上拥有的权限。< / p>

答案 1 :(得分:3)

我找到了一个基于this post的解决方案。

DECLARE v_column_exists number := 0;   
BEGIN   
  SELECT COUNT(*) INTO v_column_exists
  FROM ALL_TAB_COLUMNS 
  WHERE TABLE_NAME = 'MY_TABLE'
  AND COLUMN_NAME = 'COL_NAME';

  IF (v_column_exists = 0) THEN
    EXECUTE IMMEDIATE 'ALTER TABLE MY_TABLE ADD ( COL_NAME VARCHAR2(200) )';   
  ELSE
    EXECUTE IMMEDIATE 'ALTER TABLE MY_TABLE MODIFY ( COL_NAME VARCHAR2(200) )';
  END IF;
END;