在Oracle中更改表时捕获异常

Pau*_*aul 4 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;
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Jus*_*ave 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;
Run Code Online (Sandbox Code Playgroud)

如果您无权访问DBA_TAB_COLS,您还可以使用ALL_TAB_COLSUSER_TAB_COLS取决于表所在的架构以及您对表具有的权限.