Для моего приложения, которое использует Oracle 8 дБ, я предоставляю сценарий SQL для установки материала как триггеры, последовательности и т.д., которые могут быть скопированы и вставлены в SQL*Plus. Я хотел бы, чтобы сценарий не остановился с ошибкой, если последовательность, которую я пытаюсь создать уже, существует. Для Триггера это может легко быть сделано с помощью, "создают или заменяют триггер...", но для последовательности это не работает. Я также попробовал, ""если не существует, mysequence затем создают последовательность...", но она сделала не также. Разве существует ли некоторая альтернатива?
С другой стороны, если это не возможно, существует ли способ сделать "последовательность отбрасывания mysequence" без SQL*Plus, прерывающего сценарий, если mysequence не существует?
Если вы уверены, что сценарий всегда будет выполняться под SQL*Plus, вы можете заключить в скобки операторы CREATE SEQUENCE с директивой продолжать при ошибке:
WHENEVER SQLERROR CONTINUE
-- create sequences here, ignoring errors
WHENEVER SQLERROR EXIT SQL.SQLCODE
Имейте в виду, если в операторах create sequence есть другие ошибки (проблемы с разрешениями, синтаксические ошибки и т.д.), они будут проигнорированы
Вы можете проверить таблицу 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;
Вы можете параметризовать все другие параметры и иметь сложную функцию для создания последовательности за вас.
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;