我如何使用CREATE OR REPLACE?

我正确地理解CREATE OR REPLACE基本上是指“如果对象存在,放弃它,然后创build它”?

如果是这样,我做错了什么? 这工作:

CREATE TABLE foo (id NUMBER, title VARCHAR2(4000) DEFAULT 'Default Title') 

而这不(ORA-00922:缺less或无效的选项):

 CREATE OR REPLACE TABLE foo (id NUMBER, title VARCHAR2(4000) DEFAULT 'Default Title') 

我在做一些愚蠢的事情吗? 我似乎无法find关于这个语法的很多文档。

这适用于函数,过程,包,types,同义词,触发器和视图。

更新:

第三次更新这篇文章后,我将重新说明这一点:

这不适用于表:)

是的,这个语法有文档CREATE TABLE没有REPLACE选项。

关于语法的好处之一是,你可以确定一个CREATE OR REPLACE永远不会导致你丢失数据(你将失去的最多的是代码,希望你将它存储在源代码控制的某处)。

表的等效语法是ALTER,这意味着您必须明确列举所需的确切更改。

编辑:顺便说一句,如果你需要在脚本中做一个DROP + CREATE,并且你不关心假的“对象不存在”的错误(当DROP没有find表),你可以做这个:

 BEGIN EXECUTE IMMEDIATE 'DROP TABLE owner.mytable'; EXCEPTION WHEN OTHERS THEN IF sqlcode != -0942 THEN RAISE; END IF; END; / 

Oracle中没有创build或replace表。

你必须:

 DROP TABLE foo;
 CREATE TABLE foo(....);

CREATE OR REPLACE只能用于函数,过程,types,视图或包 – 它不能在表上工作。

下面的脚本应该在Oracle上做的伎俩:

 BEGIN EXECUTE IMMEDIATE 'drop TABLE tablename'; EXCEPTION WHEN OTHERS THEN IF sqlcode != -0942 THEN RAISE; END IF; END; 

不适用于表格,只适用于function等

这里有一些例子 。

oracle数据库的一个有用的过程,而不使用exeptions(在你必须用dba_tablesreplaceuser_tables和/或限制查询中的表空间的情况下):

 create or replace procedure NG_DROP_TABLE(tableName varchar2) is c int; begin select count(*) into c from user_tables where table_name = upper(tableName); if c = 1 then execute immediate 'drop table '||tableName; end if; end; 
 -- To Create or Replace a Table we must first silently Drop a Table that may not exist DECLARE table_not_exist EXCEPTION; PRAGMA EXCEPTION_INIT (table_not_exist , -00942); BEGIN EXECUTE IMMEDIATE('DROP TABLE <SCHEMA>.<TABLE NAME> CASCADE CONSTRAINTS'); EXCEPTION WHEN table_not_exist THEN NULL; END; / 

如果您在代码中执行,则首先使用查询来检查数据库中的表SELECT table_name FROM user_tables WHERE table_name ='XYZ'

如果logging发现则截断表,否则创build表

像创build或replace一样工作。

您可以使用CORT( http://www.softcraftltd.co.uk/cort )。 这个工具允许在Oracle中创build或replace表。 看起来像:

 create /*# or replace */ table MyTable( ... -- standard table definition ); 

它保存数据。

所以我一直在使用它,它工作得很好: – 它更像一个DROP,如果存在,但完成工作

 DECLARE VE_TABLENOTEXISTS EXCEPTION; PRAGMA EXCEPTION_INIT(VE_TABLENOTEXISTS, -942); PROCEDURE DROPTABLE(PIS_TABLENAME IN VARCHAR2) IS VS_DYNAMICDROPTABLESQL VARCHAR2(1024); BEGIN VS_DYNAMICDROPTABLESQL := 'DROP TABLE ' || PIS_TABLENAME; EXECUTE IMMEDIATE VS_DYNAMICDROPTABLESQL; EXCEPTION WHEN VE_TABLENOTEXISTS THEN DBMS_OUTPUT.PUT_LINE(PIS_TABLENAME || ' NOT EXIST, SKIPPING....'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLERRM); RAISE; END DROPTABLE; BEGIN DROPTABLE('YOUR_TABLE_HERE'); END DROPTABLE; / 

希望这有助于还参考: 在PL / SQL Developer PLS-00103错误

“创build或replace表”是不可能的。 正如其他人所说,你可以写一个程序和/或立即开始执行(…)。 因为我没有看到如何(重新)创build表格的答案,所以我提出了一个脚本作为答案。

PS:根据jeffrey-kemp提到的内容:脚本下面的内容不会保存已经存在于你要删除的表中的数据。 由于丢失数据的风险,在我们公司只允许改变生产环境中的现有表,并且不允许删除表。 通过使用drop table声明,迟早你会得到公司警察站在你的办公桌前。

 --Create the table 'A_TABLE_X', and drop the table in case it already is present BEGIN EXECUTE IMMEDIATE ' CREATE TABLE A_TABLE_X ( COLUMN1 NUMBER(15,0), COLUMN2 VARCHAR2(255 CHAR), COLUMN3 VARCHAR2(255 CHAR) )'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -955 THEN -- ORA-00955: object name already used EXECUTE IMMEDIATE 'DROP TABLE A_TABLE_X'; END IF; END; 

如果这是用于MS SQL的话。无论表格是否已经存在,下面的代码将永远运行。

 if object_id('mytablename') is not null //has the table been created already in the db Begin drop table mytablename End Create table mytablename (...