Oracle: если таблица существует

Я понимаю, что Вы говорите о программах на той же машине, но мне всегда нравилась идея передать сообщения в XML по HTTP.

Ваш сервер мог быть веб-сервером, это готово принять полезную нагрузку XML. Ваш клиент может отправить сообщения HTTP с XML в теле и получить ответ HTTP с XML в нем.

Одна причина мне нравится, это - то, что HTTP является таким широко используемым протоколом, что легко принять или создать POST HTTP или ПОЛУЧИТЬ запросы на любом языке (если Вы решаете изменить или клиент или язык сервера в будущем). HTTP и XML были вокруг некоторое время, таким образом, я думаю, что они устанавливаются.

Другая причина мне нравится он, то, что Ваш сервер мог использоваться другими клиентами также, пока они знают HTTP и XML.

321
задан Midhun MP 13 December 2013 в 01:59
поделиться

5 ответов

Лучший и наиболее эффективный способ - перехватить исключение «таблица не найдена»: это позволяет избежать накладных расходов на проверку того, существует ли таблица дважды; и не страдает от проблемы, заключающейся в том, что в случае сбоя 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;
540
ответ дан 23 November 2019 в 00:58
поделиться

Возможно, вам удастся немного повысить быстродействие за счет памяти. Если вы создаете неизменяемый массив, в котором перечислены все созданные Thingys и ссылаетесь на массив с помощью статической переменной, то вы можете проверить существование Thingy вне любой блокировки, поскольку неизменяемые массивы всегда потокобезопасны. Затем при добавлении нового Thingy вы можете создать новый массив с дополнительным Thingy и заменить его (в статической переменной) за одну (атомарную) операцию установки. Некоторые новые Thingys могут быть пропущены из-за условий гонки, но программа не должна давать сбой. K

0
ответ дан 23 November 2019 в 00:58
поделиться

К сожалению, нет, не существует таких вещей, как 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;
0
ответ дан 23 November 2019 в 00:58
поделиться

В 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
3
ответ дан 23 November 2019 в 00:58
поделиться
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 ')

126
ответ дан 23 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: