我如何使用CREATE OR REPLACE?

Jas*_*ker 93 oracle ddl oracle10g

我是否正确理解CREATE OR REPLACE基本上意味着"如果对象存在,丢弃它,然后以任何方式创建它?"

如果是这样,我做错了什么?这有效:

CREATE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
Run Code Online (Sandbox Code Playgroud)

这不是(ORA-00922:缺失或无效选项):

CREATE OR REPLACE TABLE foo (id NUMBER,
title VARCHAR2(4000) DEFAULT 'Default Title')
Run Code Online (Sandbox Code Playgroud)

我做了些蠢事吗?我似乎无法找到有关此语法的大量文档.

Qua*_*noi 149

这适用于函数,过程,包,类型,同义词,触发器和视图.

更新:

在第三次更新帖子后,我将重新制定这个:

这对表格不起作用:)

是的,有关于此语法的文档,并且没有REPLACE选项CREATE TABLE.

  • 它也不适用于物化视图 (5认同)

Jef*_*emp 33

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

表的等效语法是ALTER,这意味着您必须显式枚举所需的确切更改.

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

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)


RC.*_*RC. 21

Oracle中没有创建或替换表.

你必须:

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


And*_*ula 8

CREATE OR REPLACE 只能用于函数,过程,类型,视图或包 - 它不适用于表.


小智 5

以下脚本应该在 Oracle 上起作用:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;
Run Code Online (Sandbox Code Playgroud)


gro*_*ter 5

-- 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;
/
Run Code Online (Sandbox Code Playgroud)