Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как правильно удалить/создать таблицу безопасным способом.  [new]
Max Pro
Member

Откуда: планета Сатурн, межгалактическая станция №999
Сообщений: 2776
(чайник)
Ну если мне надо как в sql-сервере:
IF NOT Exists
(
	SELECT
		[name]
	FROM
		sys.tables
	WHERE
		[name]=tab1
)
	CREATE TABLE tab1
	(
		col1 Bit,
		coi2 Varchar(4000)
	);
то как более правильно это сделать на Оракле?
Почесав затылок, я написал так:
--ORA-00942: таблица или представление пользователя не существует.
DECLARE
	ora_00942 EXEPTION;
	PRAGMA EXCEPTION_INIT(ora_00942,-942);
BEGIN
	EXECUTE IMMEDIATE 'DROP TABLE tab1';
EXCEPTION
	WHEN ora_00942 THEN NULL;
END;
--ORA-00955: имя уже задействовано для существующего объекта.
DECLARE
	ora_00955 EXEPTION;
	PRAGMA EXCEPTION_INIT(ora_00955,-955);
BEGIN
	EXECUTE IMMEDIATE 
		'CREATE TABLE tab1
		(
			col1 Number(1),
			col2 Varchar2(4000)
		)';
EXCEPTION
	WHEN ora_00955 THEN NULL;
END;
Но не уверен, может более правильно можно?
1 июл 11, 20:02    [10909127]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить/создать таблицу безопасным способом.  [new]
Серафимный Шестикрыл
Member [заблокирован]

Откуда: С луны свалился
Сообщений: 2922
Ну можно открыть для себя представления [user/all/dba]_tables (некий аналог sys.tables).
В обработке исключений нет ничего зазорного, кстати.
1 июл 11, 20:07    [10909150]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить/создать таблицу безопасным способом.  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Max Pro, не понял, т.е. знать не надо удалил/не удалил, создал/не создал?
1 июл 11, 20:13    [10909170]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить/создать таблицу безопасным способом.  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Max Pro, еще не понятно, почему остальные ошибки нужны, а эти две игнорируются
1 июл 11, 20:14    [10909178]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить/создать таблицу безопасным способом.  [new]
Max Pro
Member

Откуда: планета Сатурн, межгалактическая станция №999
Сообщений: 2776
Серафимный Шестикрыл
Ну можно открыть для себя представления [user/all/dba]_tables (некий аналог sys.tables).
В обработке исключений нет ничего зазорного, кстати.

А в Оракле вроде функция Exists используется как метод, поэтому написать "IF Exists..." нельзя. В блоке WHERE можно Exists использовать как функцию, но это тут не поможет. Если записать что-то подобное:
DECLARE
	temp Number:=0;
BEGIN
	SELECT Count(*) INTO temp FROM user_tables WHERE table_name=Upper('tab1');
	IF temp=1 THEN
		EXECUTE IMMEDIATE 'DROP TABLE tab1';
	END IF;
END;
то будет ли это лучше, может быстрее работать будет или ещё чего?
1 июл 11, 20:28    [10909240]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить/создать таблицу безопасным способом.  [new]
Elic
Member

Откуда:
Сообщений: 29976
Max Pro
то как более правильно это сделать на Оракле?
Не создавать временные таблицы "на лету".
1 июл 11, 20:29    [10909251]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить/создать таблицу безопасным способом.  [new]
Max Pro
Member

Откуда: планета Сатурн, межгалактическая станция №999
Сообщений: 2776
xtender
Max Pro, еще не понятно, почему остальные ошибки нужны, а эти две игнорируются


Знать не надо, это так называемое безопасное удаление/создание. Этот приём часто используется, по крайней мере Микрософт именно так генерит код на создание таблиц, если пользоваться стандартными утилитами sql-сервера.

Остальные ошибки нужны обязательно, к примеру ты можешь в синтаксисе ошибиться.

Там у меня в первом посте ошибка: вместо
ora_00942 EXEPTION;
читай
ora_00942 EXСEPTION;
Исправить там не могу, так как форум sql.ru закрыт для исправлений, только через модератора можно, а я не модыр, поэтому не обессудьте.
1 июл 11, 20:38    [10909282]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно удалить/создать таблицу безопасным способом.  [new]
Max Pro
Member

Откуда: планета Сатурн, межгалактическая станция №999
Сообщений: 2776
Elic
Max Pro
то как более правильно это сделать на Оракле?
Не создавать временные таблицы "на лету".

Это не временная таблица, это часть релиза базы.
У нас коды на базу данных лежат в сорсейве в виде файлов, ну типа названы crebas.sql, cretrg.sql и так далее. При необходимости релиз накатывается на сервер (для обновления версии или отката на предыдущую).
1 июл 11, 20:46    [10909303]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить