Как использовать CREATE или REPLACE?

правильно ли я понимаю, что CREATE или 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')

Я делаю что-то глупое? Кажется, я не могу найти много документации об этом синтаксисе.

13 ответов


это работает на функциях, процедурах, пакетах, типах, синонимах, триггерах и представлениях.

обновление:

после обновления сообщения в третий раз я переформулирую это:

это не работает на столах :)

и да, есть документация на этом синтаксисе и нет на CREATE TABLE.


одна из приятных вещей о синтаксисе заключается в том, что вы можете быть уверены, что a CREATE OR REPLACE никогда не приведет к потере данных (самое большее, что вы потеряете, это код, который, надеюсь, вы будете хранить в системе управления версиями где-то).

эквивалентный синтаксис для таблиц-ALTER, что означает, что вы должны явно перечислить точные необходимые изменения.

EDIT: Кстати, если вам нужно сделать DROP + CREATE в скрипте, и вы не заботитесь о ложном ошибки" объект не существует " (когда падение не находит таблицу), вы можете сделать это:

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

в Oracle нет таблицы create или replace.

вы должны:

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

CREATE OR REPLACE может использоваться только для функций, процедур, типов, представлений или пакетов - он не будет работать с таблицами.


следующий скрипт должен сделать трюк с Oracle:

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

не работает с таблицами, только функций и т. д.

вот сайт с некоторыми примеры.


полезная процедура для баз данных oracle без использования exeptions (при обстоятельствах вы должны заменить 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;

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

Если вы делаете в коде, то сначала проверить таблицу в базе данных с помощью запроса Выберите table_name Из user_tables и Где table_name = 'XYZ'

Если запись найдена, то усечь таблицу, в противном случае создать таблицу

работа как создать или заменить.


вы можете использовать CORT (www.softcraftltd.co.uk/cort). Этот инструмент позволяет создать или заменить таблицу в Oracle. Это выглядит так:

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

Он сохраняет данные.


поэтому я использовал это, и он работал очень хорошо: - он работает больше как падение, если существует, но выполняет работу

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 ошибка в PL / SQL Developer


'создать или заменить таблицу не возможна. Как заявили другие, вы можете написать процедуру и / или использовать begin execute немедленно (...). Поскольку я не вижу ответа с тем, как (повторно)создать таблицу, я поместил сценарий в качестве ответа.

PS: в строке того, что упомянул Джеффри-Кемп: этот скрипт не будет сохранять данные, которые уже присутствуют в таблице, которую вы собираетесь удалить. Из-за риска потери данных, в нашей компании разрешено изменять только существующие таблицы на производственная среда, и не позволено упасть таблицы. Используя инструкцию 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 (...