sql - 在 Oracle 中更改表时捕获异常

标签 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 命令来实现这一点?

谢谢!

最佳答案

为了将 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取决于表所在的架构以及您对表的权限。

关于sql - 在 Oracle 中更改表时捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115677/

相关文章:

sql - 如何更改 PostgreSQL 数据库表中列的位置?

postgresql - 将空列添加到 postgres 表会导致锁定吗?

使用 RAISERROR 的 SQL 语句终止

sql - 返回基于 a 的条目包含带有 sql 的谓词

oracle - 在 Oracle 中从另一个存储过程调用一个存储过程

sql - 使用单个 PL SQL 查询返回多个计数

sqlite - 使用sqlite alter table drop column语法错误

sql - 使用另一个 select 语句的引号内的值将数据插入表中

mysql - LIMIT 在关节的右侧

oracle - 仅当存在时才删除触发器 (ORACLE)