Как я могу использовать СОЗДАТЬ ИЛИ ЗАМЕНИТЬ? - PullRequest
89 голосов
/ 17 июня 2009

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

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

Ответы [ 13 ]

143 голосов
/ 17 июня 2009

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

Обновление:

После третьего обновления поста, я переформулирую это:

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

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

32 голосов
/ 18 июня 2009

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

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

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

BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE owner.mytable';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; END IF;
END;
/
20 голосов
/ 17 июня 2009

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

Вы должны:

DROP TABLE foo;
CREATE TABLE foo (....);
8 голосов
/ 17 июня 2009

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

4 голосов
/ 16 марта 2010

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

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;
3 голосов
/ 22 августа 2014
-- 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;
/
3 голосов
/ 17 июня 2009

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

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

2 голосов
/ 19 апреля 2014

Полезная процедура для баз данных 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;
1 голос
/ 12 января 2014

Вы можете использовать CORT ( www.softcraftltd.co.uk / cort ). Этот инструмент позволяет СОЗДАТЬ ИЛИ ЗАМЕНИТЬ таблицу в Oracle. Похоже:

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

Сохраняет данные.

1 голос
/ 24 декабря 2013

Если вы делаете в коде, то сначала проверьте таблицу в базе данных используя запрос ВЫБЕРИТЕ имя_таблицы FROM user_tables ГДЕ table_name = 'XYZ'

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

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

...