Как использовать CREATE OR REPLACE?
Вопрос
Правильно ли я понимаю, что 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')
Я делаю что-то глупое?Кажется, я не могу найти много документации по этому синтаксису.
Решение
Это работает с функциями, процедурами, пакетами, типами, синонимами, триггерами и представлениями.
Обновлять:
После обновления поста в третий раз переформулирую это:
На таблицах это не работает :)
И да, есть документация в этом синтаксисе, и нет никаких REPLACE
вариант для CREATE TABLE
.
Другие советы
Одна из приятных особенностей синтаксиса заключается в том, что вы можете быть уверены, что 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;
/
В Oracle нет таблицы создания или замены.
Вы должны:
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;
Не работает с таблицами, только с функциями и т. д.
Вот сайт с некоторыми примерами .
-- 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;
/
Полезная процедура для баз данных 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;
Если вы делаете в коде, то сначала проверьте таблицу в базе данных используя запрос ВЫБЕРИТЕ имя_таблицы FROM user_tables ГДЕ table_name = 'XYZ'
если запись найдена, то урезать таблицу в противном случае создать таблицу
Работайте как Создать или Заменить.
Вы можете использовать CORT ( www.softcraftltd.co.uk/cort ). Этот инструмент позволяет СОЗДАТЬ ИЛИ ЗАМЕНИТЬ таблицу в Oracle. Это выглядит так:
create /*# or replace */ table MyTable(
... -- standard table definition
);
Он сохраняет данные.
Итак, я использовал это, и оно сработало очень хорошо: - оно работает скорее как 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
«Создать или заменить таблицу» невозможно. Как уже говорилось, вы можете написать процедуру и / или использовать команду begin execute немедленно (...). Поскольку я не вижу ответа о том, как (повторно) создать таблицу, я добавил сценарий в качестве ответа.
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;
Если это для 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 (...