Я понимаю, что Вы говорите о программах на той же машине, но мне всегда нравилась идея передать сообщения в XML по HTTP.
Ваш сервер мог быть веб-сервером, это готово принять полезную нагрузку XML. Ваш клиент может отправить сообщения HTTP с XML в теле и получить ответ HTTP с XML в нем.
Одна причина мне нравится, это - то, что HTTP является таким широко используемым протоколом, что легко принять или создать POST HTTP или ПОЛУЧИТЬ запросы на любом языке (если Вы решаете изменить или клиент или язык сервера в будущем). HTTP и XML были вокруг некоторое время, таким образом, я думаю, что они устанавливаются.
Другая причина мне нравится он, то, что Ваш сервер мог использоваться другими клиентами также, пока они знают HTTP и XML.
Лучший и наиболее эффективный способ - перехватить исключение «таблица не найдена»: это позволяет избежать накладных расходов на проверку того, существует ли таблица дважды; и не страдает от проблемы, заключающейся в том, что в случае сбоя DROP по какой-либо другой причине (которая может быть важна) исключение все равно вызывается для вызывающего: Для справки, вот эквивалентные блоки для других типов объектов:
Последовательность
BEGIN
EXECUTE IMMEDIATE 'DROP SEQUENCE ' || sequence_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2289 THEN
RAISE;
END IF;
END;
Представление
BEGIN
EXECUTE IMMEDIATE 'DROP VIEW ' || view_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
Триггер
BEGIN
EXECUTE IMMEDIATE 'DROP TRIGGER ' || trigger_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4080 THEN
RAISE;
END IF;
END;
Индекс
BEGIN
EXECUTE IMMEDIATE 'DROP INDEX ' || index_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -1418 THEN
RAISE;
END IF;
END;
Столбец
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE ' || table_name
|| ' DROP COLUMN ' || column_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -904 AND SQLCODE != -942 THEN
RAISE;
END IF;
END;
Ссылка на базу данных
BEGIN
EXECUTE IMMEDIATE 'DROP DATABASE LINK ' || dblink_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2024 THEN
RAISE;
END IF;
END;
Материализованное представление
BEGIN
EXECUTE IMMEDIATE 'DROP MATERIALIZED VIEW ' || mview_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -12003 THEN
RAISE;
END IF;
END;
Тип
BEGIN
EXECUTE IMMEDIATE 'DROP TYPE ' || type_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Ограничение
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE ' || table_name
|| ' DROP CONSTRAINT ' || constraint_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -2443 AND SQLCODE != -942 THEN
RAISE;
END IF;
END;
Задание планировщика
BEGIN
DBMS_SCHEDULER.drop_job(job_name);
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -27475 THEN
RAISE;
END IF;
END;
Пользователь / Схема
BEGIN
EXECUTE IMMEDIATE 'DROP USER ' || user_name;
/* you may or may not want to add CASCADE */
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -1918 THEN
RAISE;
END IF;
END;
Пакет
BEGIN
EXECUTE IMMEDIATE 'DROP PACKAGE ' || package_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Процедура
BEGIN
EXECUTE IMMEDIATE 'DROP PROCEDURE ' || procedure_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Функция
BEGIN
EXECUTE IMMEDIATE 'DROP FUNCTION ' || function_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -4043 THEN
RAISE;
END IF;
END;
Табличное пространство
BEGIN
EXECUTE IMMEDIATE 'DROP TABLESPACE' || tablespace_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -959 THEN
RAISE;
END IF;
END;
Синоним
BEGIN
EXECUTE IMMEDIATE 'DROP SYNONYM ' || synonym_name;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -1434 THEN
RAISE;
END IF;
END;
Возможно, вам удастся немного повысить быстродействие за счет памяти. Если вы создаете неизменяемый массив, в котором перечислены все созданные Thingys и ссылаетесь на массив с помощью статической переменной, то вы можете проверить существование Thingy вне любой блокировки, поскольку неизменяемые массивы всегда потокобезопасны. Затем при добавлении нового Thingy вы можете создать новый массив с дополнительным Thingy и заменить его (в статической переменной) за одну (атомарную) операцию установки. Некоторые новые Thingys могут быть пропущены из-за условий гонки, но программа не должна давать сбой. K
К сожалению, нет, не существует таких вещей, как drop, если существует, или CREATE IF NOT EXIST
Вы можете написать сценарий plsql, чтобы включить туда логику.
http: // download.oracle.com/docs/cd/B12037_01/server.101/b10759/statements_9003.htm
Я не очень разбираюсь в Oracle Syntax, но думаю, что сценарий @ Erich будет примерно таким.
declare
cant integer
begin
select into cant count(*) from dba_tables where table_name='Table_name';
if count>0 then
BEGIN
DROP TABLE tableName;
END IF;
END;
В oracle нет "DROP TABLE IF EXISTS", вам нужно будет выполнить оператор select.
попробуйте это (я не разбираюсь в синтаксисе Oracle, поэтому, если мои переменные ошибочны, пожалуйста, простите меня):
declare @count int
select @count=count(*) from all_tables where table_name='Table_name';
if @count>0
BEGIN
DROP TABLE tableName;
END
declare
c int;
begin
select count(*) into c from user_tables where table_name = upper('table_name');
if c = 1 then
execute immediate 'drop table table_name';
end if;
end;
Это для проверки, существует ли таблица в текущей схеме.
Чтобы проверить, существует ли уже данная таблица в другой схеме, вам нужно будет использовать all_tables
вместо user_tables
и добавить условие all_tables.owner = upper ('schema_name ')