我正在使用Oracle SQL developer 2.1创建同义词。
CREATE OR REPLACE SYNONYM "ETKS_PR_RW"."SQ_CLDOS_ATCHMNT_ID"
FOR "CLDOS_ONLINE_DBA"."SQ_CLDOS_ATCHMNT_ID";我如何检查如果这个同义词已经存在,那么如果它已经存在,就不要创建这个同义词。
发布于 2012-05-07 17:44:49
因为您使用的是replace关键字,所以不需要先检查同义词是否存在。您将覆盖与先前名称存在的任何同义词。
谨慎使用replace的唯一原因是您可能有相同名称的不同同义词。如果你的数据库组织得很好,这种情况就不应该发生。你应该总是知道你所有的对象是什么,以及同义词指向哪里。
但是,如果您确实想这样做,有几个选择:
replace。如果同义词已经存在,并且不能获取数据字典,则该语句将抛出错误,因为您处于多个模式中,all_synonyms似乎是最好的选择。select * from owner where owner= 'ETKS_PR_RW‘和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可以有大小写的对象,但很少值得这么麻烦。所有对象都将自动大小写,因此您不需要"。
发布于 2012-05-07 16:04:06
我认为如果您删除了OR REPLACE关键字,它会提示您它存在
或者,您可以使用这些表创建pl/sql代码。
desc dba_synonyms
desc user_synonyms使其更加灵活和定制化
假设Oracle PL/SQL
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; https://stackoverflow.com/questions/10478625
复制相似问题