如何使用CREATE或REPLACE?


98

我理解CREATE OR REPLACE的基本含义是“如果对象存在,则将其删除,然后以任意一种方式创建它”,是否正确?

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

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

并且这不是(ORA-00922:缺少或无效的选项):

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

我在做蠢事吗?我似乎找不到太多有关此语法的文档。

Answers:


153

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

更新:

在第三次更新帖子后,我将重新制定此内容:

这不适用于表:)

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


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;
/

23

Oracle中没有创建或替换表。

你必须:

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


4

以下脚本应在Oracle上发挥作用:

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

3

不适用于表格,仅适用于函数等。

这是一个带有一些示例的站点。


3

在不使用示例的情况下对oracle数据库有用的过程(在某些情况下,您必须用dba_tables替换user_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;

3
-- 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;
/

多一点的代码比其他的例子,但也多了几分清晰的在它的目的
格罗斯特

1

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

如果找到记录,则截断表,否则创建表

就像创建或替换一样工作。


1

您可以使用CORT(www.softcraftltd.co.uk/cort)。该工具允许在Oracle中创建或替换表。看起来像:

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

它保留数据。


1

因此,我一直在使用它,并且效果很好:-它更像是DROP IF EXISTS,但是可以完成工作

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错误


1

“创建或替换表”是不可能的。正如其他人所述,您可以编写一个过程和/或使用立即开始执行(...)。因为我看不到如何(重新)创建表的答案,所以我把脚本作为答案。

PS:与jeffrey-kemp所说的一致:该脚本下面的内容不会保存您要删除的表中已经存在的数据。由于存在丢失数据的风险,在我们公司中,仅允许更改生产环境中的现有表,而不允许删除表。通过使用放置表声明,您迟早会得到公司警察在您办公桌旁的支持。

--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;

您需要与A_TABLE_EXAMPLE和A_TABLE_X保持一致吗?
乔纳森·莱夫勒

0

我会做这样的事情

  begin
     for i in (select table_name from user_tables where table_name = 'FOO') loop
        execute immediate 'drop table '||i.table_name;
     end loop;
  end;

  execute immediate 'CREATE TABLE FOO (id NUMBER,
                                       title VARCHAR2(4000)) ';

-4

如果这是针对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 (...

1
抱歉,但这是Oracle。:-)
杰森·贝克

注释“ //表中是否有数据”是否正确?
Jeffrey Kemp

不好意思,Object_id检查表是否存在于数据库中。它应该说//表是否已经在数据库中创建了
JuniorFlip 2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.