Как использовать СОЗДАТЬ ИЛИ ЗАМЕНИТЬ?

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

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

Джейсон Бейкер
источник

Ответы:

154

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

Обновить:

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

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

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

Quassnoi
источник
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;
СОЗДАТЬ ТАБЛИЦУ foo (....);
RC.
источник
10

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

Энди Микула
источник
1
CREATE OR REPLACEтакже работает для синонимов и триггеров
Ричард Митчелл
4

Следующий сценарий должен помочь с Oracle:

BEGIN
  EXECUTE IMMEDIATE 'drop TABLE tablename';
EXCEPTION
  WHEN OTHERS THEN
    IF sqlcode != -0942 THEN RAISE; 
    END IF;
END;
Каван
источник
3

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

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

Северный полюс
источник
3

Полезная процедура для баз данных 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;
XorNegative
источник
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;
/   

Надеюсь, это поможет. Также ссылка: Ошибка PLS-00103 в PL / SQL Developer.

BGDev
источник
1

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

PS: в соответствии с тем, что упомянул Джеффри-Кемп: этот сценарий ниже НЕ будет сохранять данные, которые уже присутствуют в таблице, которую вы собираетесь удалить. Из-за риска потери данных в нашей компании разрешено изменять только существующие таблицы в производственной среде, и нельзя удалять таблицы. Используя выписку из таблицы, вы рано или поздно получите полицию компании, которая будет стоять у вашего стола.

--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. :-)
Джейсон Бейкер
комментарий "// есть ли данные в таблице" точен?
Джеффри Кемп,
извините, немного лучше, object_id проверяет, существует ли таблица в db. он должен сказать, // была ли таблица уже создана в базе данных
JuniorFlip