我正在尝试在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命令实现此目的?
谢谢!
答案 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_COLS
或USER_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;