Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中更改表时捕获异常_Sql_Oracle_Alter Table - Fatal编程技术网

Sql 在Oracle中更改表时捕获异常

Sql 在Oracle中更改表时捕获异常,sql,oracle,alter-table,Sql,Oracle,Alter Table,我正试图在Oracle中编写一个命令,该命令将根据列是否已经存在来删除、添加或修改列。基本上是这样的: 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中

我正试图在Oracle中编写一个命令,该命令将根据列是否已经存在来删除、添加或修改列。基本上是这样的:

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;
声明
l_cnt整数;
开始
选择计数(*)
进入l_cnt
来自dba\u tab\u cols
其中table_name='MY_table'
和所有者=
列名称='列名称';
如果(l_cnt=0)
然后
立即执行“ALTERTABLE my_TABLE ADD(col_name VARCHAR2(100))”;
其他的
立即执行“ALTER TABLE my_TABLE MODIFY(col_name VARCHAR2(100))”;
如果结束;
结束;

如果您无权访问
DBA\u TAB\u COLS
,也可以使用
ALL\u TAB\u COLS
USER\u TAB\u COLS
,具体取决于表所在的架构以及您对表的权限。

我找到了一个基于


谢谢,我真的找到了另一篇有类似问题的帖子,并且发布了一个与你的答案几乎相同的帖子!
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;