Sql 在Oracle中更改表时捕获异常
我正试图在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中
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;