我如何使用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 (...