我正在使用Oracle SQL Developer 2.1来创建同义词。
CREATE OR REPLACE SYNONYM "ETKS_PR_RW"."SQ_CLDOS_ATCHMNT_ID"
FOR "CLDOS_ONLINE_DBA"."SQ_CLDOS_ATCHMNT_ID";
如果这个同义词已经存在,我该如何检查并且不创建重复的同义词?
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可以有大小写对象,但很少值得麻烦。所有对象将自动大写,所以您不需要"
。
我认为如果您删除OR REPLACE关键字,它会提示您该对象已存在
或者您可以使用这些表创建PL/SQL代码
desc dba_synonyms
desc user_synonyms
DECLARE
src_schema VARCHAR2(256) := 'EMPIK_DYNAMO_01';
target_schema VARCHAR2(256) := 'EMPIK_PORTAL_BETA_1';
CURSOR src_objects IS
SELECT table_name AS object_name
FROM all_all_tables
WHERE owner = src_schema
UNION
SELECT sequence_name AS object_name
FROM all_sequences
WHERE sequence_owner = src_schema;
BEGIN
FOR next_row IN src_objects LOOP
BEGIN
EXECUTE IMMEDIATE 'CREATE or REPLACE SYNONYM '|| target_schema|| '.'
||
next_row.object_name|| ' for '|| src_schema|| '.'||
next_row.object_name;
EXCEPTION
WHEN OTHERS THEN
dbms_output.Put_line('ERROR WHILE CREATING SYNONYM FOR: '
|| next_row.object_name);
dbms_output.Put_line(SQLERRM);
END;
END LOOP;
END;
/
这里是针对您的问题的定制化解决方案
BEGIN
EXECUTE IMMEDIATE 'CREATE or REPLACE SYNONYM ETKS_PR_RW.SQ_CLDOS_ATCHMNT_ID FOR CLDOS_ONLINE_DBA.SQ_CLDOS_ATCHMNT_ID';
EXCEPTION
WHEN OTHERS THEN
dbms_output.Put_line ('ERROR WHILE CREATING SYNONYM FOR: SQ_CLDOS_ATCHMNT_ID');
dbms_output.Put_line (SQLERRM);
END;
dbms_output.put_line
错误。这样做毫无意义,只会掩盖你应该处理的错误。 - Bendbms_output.put_line
是处理错误的非常糟糕的方式。您必须在那里才能注意到它们!此外,我真的不理解您最新更新的原因。这过于复杂了。 - Ben