2017-12-04 21 views
1

複数のオブジェクトの変数の値を変更するスクリプトを記述できるかどうかは疑問でした。Oracle - 複数のオブジェクトの変数値を変更する

私は変更する必要があるオブジェクトのリストを取得するには、次のクエリを実行しました:

select distinct owner, name, type from dba_source 
where lower(text) like '%environment_v%'; 

は、私はそれらのすべてに10から20にenvironment_vの値を変更するために書くことができるスクリプトがありますオブジェクト?

ありがとう

答えて

0

これはほとんど完全に自動化したくないという問題です。以下のコードは関連するオブジェクトを見つけ、DDLを返します。しかし、コードの変更とコードの実行は手動で行う必要があります。

コードを正しく解析して変更することは難しい問題です。使用している検索文字列は、12.2のSYSスキーマで多くの誤検出を返します。おそらくそれらのオブジェクトを変更したくないでしょう。

--Create DDL statements that contain "%environment_v%". 
--These statements must be modified to include the new code. 
select owner, object_type, object_name, dbms_metadata.get_ddl(object_type, object_name, owner) 
from 
(
    --Convert DBA_OBJECTS.OBJECT_TYPE to DBMS_METADATA object type: 
    select 
     owner, 
     --Java object names may need to be converted with DBMS_JAVA.LONGNAME. 
     --That code is not included since many database don't have Java installed. 
     object_name, 
     decode(object_type, 
      'DATABASE LINK',  'DB_LINK', 
      'JOB',    'PROCOBJ', 
      'RULE SET',   'PROCOBJ', 
      'RULE',    'PROCOBJ', 
      'EVALUATION CONTEXT', 'PROCOBJ', 
      'PACKAGE',   'PACKAGE_SPEC', 
      'PACKAGE BODY',  'PACKAGE_BODY', 
      'TYPE',    'TYPE_SPEC', 
      'TYPE BODY',   'TYPE_BODY', 
      'MATERIALIZED VIEW', 'MATERIALIZED_VIEW', 
      'QUEUE',    'AQ_QUEUE', 
      'JAVA CLASS',   'JAVA_CLASS', 
      'JAVA TYPE',   'JAVA_TYPE', 
      'JAVA SOURCE',  'JAVA_SOURCE', 
      'JAVA RESOURCE',  'JAVA_RESOURCE', 
      object_type 
     ) object_type 
    from dba_objects 
    where 
     --These objects are included with other object types. 
     object_type not in ('INDEX PARTITION','INDEX SUBPARTITION', 
      'LOB','LOB PARTITION','TABLE PARTITION','TABLE SUBPARTITION') 
     --Ignore system-generated types that support collection processing. 
     and not (object_type = 'TYPE' and object_name like 'SYS_PLSQL_%') 
     --Exclude nested tables, their DDL is part of their parent table. 
     and (owner, object_name) not in (select owner, table_name from dba_nested_tables) 
     --Exclude overflow segments, their DDL is part of their parent table. 
     and (owner, object_name) not in (select owner, table_name from dba_tables where iot_type = 'IOT_OVERFLOW') 
     --Only look for objects with a specific variable. 
     and (owner, object_name, object_type) in 
     (
      select owner, name, type 
      from dba_source 
      where lower(text) like '%environment_v%' 
     ) 
) 
order by owner, object_type, object_name; 

上記クエリは、this answerに基づいています。その答えは10回編集されています。私は何千ものオブジェクトに使っていますので、DDLを生成するための出発点になるはずです。

理想的には、バージョン管理されたテキストファイルで、データベース上で直接変更することはありません。

関連する問題