Поскольку вы используете ключевое слово replace
, нет необходимости сначала проверять, существует ли синоним. Вы перезапишете любой существующий синоним с предыдущим именем.
Единственная причина, по которой следует опасаться использования replace
, заключается в том, что у вас может быть другой синоним с тем же именем. Если ваша база данных организована хорошо, этого не должно произойти. Вы всегда должны знать, что представляют собой все ваши объекты и куда указывают синонимы.
Однако, если вы хотите, есть несколько вариантов:
- Удалить
replace
. Оператор выдаст ошибку, если синоним уже существует и не будет перезаписан.
Запросите словарь данных, поскольку вы находитесь в нескольких схемах all_synonyms
. кажется лучшей ставкой.
select *
from all_synonyms
where owner = 'ETKS_PR_RW'
and synonym_name = 'SQ_CLDOS_ATCHMNT_ID';
Если вы хотите объединить их в один блок, вы можете сделать что-то вроде этого:
declare
l_exists number;
begin
-- check whether the synonym exists
select 1
into l_exists
from all_synonyms
where owner = 'ETKS_PR_RW'
and synonym_name = 'SQ_CLDOS_ATCHMNT_ID';
-- an error gets raise if it doesn-t.
exception when no_data_found then
-- DDL has to be done inside execute immediate in a block.
execute immediate 'CREATE OR REPLACE SYNONYM ETKS_PR_RW.SQ_CLDOS_ATCHMNT_ID
FOR CLDOS_ONLINE_DBA.SQ_CLDOS_ATCHMNT_ID';
end;
/
В немного отдельном не пожалуйста, не цитируйте имена объектов. У Oracle могут быть объекты в корпусе, но это очень, очень редко стоит хлопот. Все объекты будут автоматически отображаться в верхнем регистре, поэтому вам не нужен "
.
person
Ben
schedule
07.05.2012