Есть ли что-то как, “если не существуют, создают последовательность …” в Oracle SQL?

Для моего приложения, которое использует Oracle 8 дБ, я предоставляю сценарий SQL для установки материала как триггеры, последовательности и т.д., которые могут быть скопированы и вставлены в SQL*Plus. Я хотел бы, чтобы сценарий не остановился с ошибкой, если последовательность, которую я пытаюсь создать уже, существует. Для Триггера это может легко быть сделано с помощью, "создают или заменяют триггер...", но для последовательности это не работает. Я также попробовал, ""если не существует, mysequence затем создают последовательность...", но она сделала не также. Разве существует ли некоторая альтернатива?

С другой стороны, если это не возможно, существует ли способ сделать "последовательность отбрасывания mysequence" без SQL*Plus, прерывающего сценарий, если mysequence не существует?

18
задан tshepang 9 January 2012 в 10:20
поделиться

3 ответа

Если вы уверены, что сценарий всегда будет выполняться под SQL*Plus, вы можете заключить в скобки операторы CREATE SEQUENCE с директивой продолжать при ошибке:

WHENEVER SQLERROR CONTINUE
-- create sequences here, ignoring errors
WHENEVER SQLERROR EXIT SQL.SQLCODE

Имейте в виду, если в операторах create sequence есть другие ошибки (проблемы с разрешениями, синтаксические ошибки и т.д.), они будут проигнорированы

8
ответ дан 30 November 2019 в 08:10
поделиться

Вы можете проверить таблицу user_sequence , чтобы узнать, существует ли уже создаваемая последовательность.

Подобно решению davek : Идея состоит в том, что перед созданием любой последовательности отбросьте последовательность и создайте ее, все в динамическом SQL, создайте функцию и скажите, когда вы нужно создать 10 последовательностей, пусть функция позаботится ...

function crt_seq(p_seq_name varchar2)
return boolean
begin
   for i in (select 1 from user_sequence where sequence_name = upper(p_seq_name))
   loop
   ---- Already exists. You can drop and recreate or return false to error out
   execute immediate 'drop sequence '||p_seq_name;
   execute immediate 'create sequence '||p_seq_name||' start with 1 increment
                    by 1 nocache';
   end loop;
   return true;
exception
when others then
   return false;
end;

Вы можете параметризовать все другие параметры и иметь сложную функцию для создания последовательности за вас.

1
ответ дан 30 November 2019 в 08:10
поделиться
DECLARE
  v_dummy NUMBER;
BEGIN
  -- try to find sequence in data dictionary
  SELECT 1
  INTO v_dummy
  FROM user_sequences
  WHERE sequence_name = 'MY_SEQUENCE_NAME';

  -- if sequence found, do nothing
EXCEPTION
  WHEN no_data_found THEN
    -- sequence not found, create it
    EXECUTE IMMEDIATE 'create sequence my_sequence_name';
END;
15
ответ дан 30 November 2019 в 08:10
поделиться
Другие вопросы по тегам:

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