14

シノニムの作成にOracleSQLDeveloper2.1を使用しています。

CREATE OR REPLACE SYNONYM "ETKS_PR_RW"."SQ_CLDOS_ATCHMNT_ID" 
    FOR "CLDOS_ONLINE_DBA"."SQ_CLDOS_ATCHMNT_ID";

この同義語がすでに存在する場合、存在する場合は同義語を作成しないことを確認するにはどうすればよいですか。

4

2 に答える 2

29

キーワードを使用しているreplaceため、同義語が最初に存在するかどうかを確認する必要はありません。以前の名前で存在していた同義語を上書きします。

使用に注意する唯一の理由replaceは、同じ名前の別の同義語がある可能性がある場合です。データベースが適切に編成されている場合、これは発生しないはずです。すべてのオブジェクトが何であり、同義語がどこを指しているかを常に知っておく必要があります。

ただし、必要に応じて、いくつかのオプションがあります。

  1. を削除しreplaceます。同義語がすでに存在し、上書きされない場合、ステートメントはエラーをスローします。
  2. 複数のスキーマを使用しているため、データディクショナリをクエリするのall_synonymsが最善の策のようです。

    select *
      from all_synonyms
     where owner = 'ETKS_PR_RW'
       and synonym_name = 'SQ_CLDOS_ATCHMNT_ID';
    

これらを1つのブロックに結合する場合は、次のようにすることができます。

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-07T09:44:49.283 に答える
1

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; 
于 2012-05-07T08:04:05.900 に答える