2012-05-07 53 views

回答

20

當你正在使用的replace關鍵字沒有必要檢查是否代名詞第一存在。你會重寫任何與以前的名字相同的同義詞。

要警惕使用replace的唯一原因是,如果您可能使用相同名稱的不同同義詞。如果你的數據庫組織的很好,這不應該發生。你應該總是知道你的所有對象是什麼以及同義詞在哪裏。

但是,如果你想有幾個選項:

  1. 刪除replace。如果同義詞已經存在並且不會被覆蓋,則該語句將引發錯誤。
  2. 查詢數據字典,因爲你在多個模式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; 
/

在一個稍微分開不請不要引用您的對象名稱。甲骨文可能有套管對象,但這是非常非常罕見的麻煩。所有物體都將自動上蓋,因此您不需要"

-1

我認爲,如果你刪除或更換關鍵字它會提示你,它存在

,也可以使用這些表創建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; 
+0

你能告訴我選項2的語法嗎?這就是我要找的。 –

+0

這裏是一個引導的例子http://snipplr.com/view/39190/create-synonyms/我確定這是你想要的,我希望給我接受回答thankx事先 – shareef

+0

乾草兄弟這是更復雜,我認爲它會複製所有對象。 –

相關問題