【问题标题】:How do I use CREATE OR REPLACE?如何使用创建或替换?
【发布时间】:2010-11-03 17:47:53
【问题描述】:

我是否正确理解 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')

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

【问题讨论】:

    标签: oracle oracle10g ddl


    【解决方案1】:

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

    更新:

    第三次更新帖子后,我将重新表述:

    这不适用于表格 :)

    是的,这种语法有documentation,而CREATE TABLE 没有REPLACE 选项。

    【讨论】:

      【解决方案2】:

      Oracle 中没有创建或替换表。

      你必须:

      删除表 foo; 创建表 foo (....);

      【讨论】:

        【解决方案3】:

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

        这是一个有一些examples 的网站。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • CREATE OR REPLACE 也适用于同义词和触发器
          【解决方案5】:

          如果这是用于 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 (...
          

          【讨论】:

          • 对不起,这是甲骨文。 :-)
          • 注释“//表中有数据”准确吗?
          • sorry 好一点,object_id 看看表是否存在于db中。它应该说//已经在数据库中创建了表
          【解决方案6】:

          语法的优点之一是您可以确定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;
          /
          

          【讨论】:

            【解决方案7】:

            以下脚本应该可以在 Oracle 上使用:

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

            【讨论】:

              【解决方案8】:

              如果你在代码中做,那么首先检查数据库中的表 通过使用查询 选择表名 来自用户表 WHERE table_name = 'XYZ'

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

              像创建或替换一样工作。

              【讨论】:

                【解决方案9】:

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

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

                它保存数据。

                【讨论】:

                  【解决方案10】:

                  不使用异常的 oracle 数据库的有用过程(在某些情况下,您必须将 user_tables 替换为 dba_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;
                  

                  【讨论】:

                    【解决方案11】:
                    -- 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;
                    /
                    

                    【讨论】:

                    • 代码比其他示例多一点,但目的更清晰
                    【解决方案12】:

                    所以我一直在使用它,并且效果很好:-它更像是 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;
                    /   
                    

                    希望这会有所帮助 另请参考: PLS-00103 Error in PL/SQL Developer

                    【讨论】:

                      【解决方案13】:

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

                      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;
                      

                      【讨论】:

                      • 需要和A_TABLE_EXAMPLE和A_TABLE_X保持一致吗?
                      【解决方案14】:

                      我会做这样的事情

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

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-06-10
                        • 2010-11-14
                        • 1970-01-01
                        • 2016-12-05
                        • 1970-01-01
                        • 2023-04-11
                        • 1970-01-01
                        相关资源
                        最近更新 更多