Как использовать 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; /
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; /
Если вы делаете в коде, то сначала проверить таблицу в базе данных с помощью запроса Select имя_таблицы Из 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 immediately (...). Поскольку я не вижу ответа с тем, как (повторно)создать таблицу, я поставил скрипт в качестве ответа.
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;