Как я могу использовать CREATE OR REPLACE?

75

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

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

Теги:
oracle10g
ddl

13 ответов

116
Лучший ответ

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

Update:

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

Это не работает с таблицами:)

И да, в этом синтаксисе есть документация, и для CREATE TABLE нет опции REPLACE > .

  • 1
    Вздох, клянусь, я читал, что это где-то сделал. Ну что ж. :)
  • 5
    Это также не работает для материализованных представлений
Показать ещё 2 комментария
30

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

Эквивалентным синтаксисом для таблиц является ALTER, что означает, что вы должны явно перечислять точные изменения, которые требуются.

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

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

В Oracle нет таблицы создания или замены.

Вы должны:

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

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

  • 1
    CREATE OR REPLACE также работает для синонимов и триггеров
4

Следующее script должно сделать трюк в Oracle:

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

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

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

2
-- 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;
/
  • 0
    Чуть больше кода, чем в других примерах, но и более понятный в своем назначении.
2

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

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

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

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

  • 0
    Сайт, кажется, был обманут ...
  • 0
    Ах. дерьмо ... Спасибо, что дали мне знать ...
1

Если вы делаете код, сначала проверяйте таблицу в базе данных используя запрос  SELECT имя_таблицы FROM user_tables  WHERE table_name = 'XYZ'

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

Работайте как Создать или Заменить.

0

"Создать или заменить таблицу" невозможно. Как было указано другими, вы можете написать процедуру и/или начать немедленно начать выполнение (...). Поскольку я не вижу ответа на то, как (re) создать таблицу, я отвел script в качестве ответа.

PS: в соответствии с тем, что сказал jeffrey-kemp: это ниже script НЕ сохранит данные, которые уже присутствуют в таблице, которую вы собираетесь сбросить. Из-за риска потери данных в нашей компании разрешено изменять существующие таблицы в рабочей среде, и не разрешается отбрасывать таблицы. Используя инструкцию 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;
  • 0
    Нужно ли вам соответствовать A_TABLE_EXAMPLE и A_TABLE_X?
  • 0
    да, действительно, Джонатан Леффлер. Я изменил это.
0

Итак, я использовал это, и он работал очень хорошо: - он больше похож на 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 Ошибка в PL/SQL Developer

-2

Если это для 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 (...
  • 0
    Извините, но это Оракул. :-)
  • 0
    Точно ли комментарий "// есть ли данные в таблице"?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню