2016-05-25 142 views
0

バージョン管理で管理するためにデータベースメタデータをファイルにダンプするカスタムプログラムを作成しています。データポンプまたはエクスポートが動作するデフォルトの方法は、いくつかの理由で理想的ではありません(たとえば、テーブルごとに別々のディレクトリが必要です)。dbms_metadata.GET_DEPENDENT_DDLでエラーを回避する方法

Sql Developerには、任意のオブジェクトのエクスポートスクリプトを作成するためのさまざまな方法が用意されています。 1つの方法は、オブジェクトを右クリックしてQuick DDLを選択することです。作成したログを表示することで、DDLスクリプトを作成するために実際に発生したSQLを確認できます。私はこれらのスクリプトを使って私のカスタムプログラムを書いてきましたが、大部分は完璧でした。

私は、マテリアライズド・ビューのDDLを生成するとき、それは生成SQLは:SQL DeveloperのQuick DDLを介して実行すると、このスクリプトの

SELECT DBMS_METADATA.GET_DDL('MATERIALIZED_VIEW',:name,:owner) FROM DUAL 
UNION ALL 
SELECT DBMS_METADATA.GET_DEPENDENT_DDL('INDEX',TABLE_NAME, TABLE_OWNER) FROM (
    SELECT table_name, table_owner FROM all_indexes 
    WHERE table_owner = :owner AND table_name = :name 
    AND index_name NOT IN (
     SELECT constraint_name FROM sys.all_constraints 
     WHERE table_name = table_name AND constraint_type = 'P' 
    ) AND ROWNUM = 1 
) 
UNION ALL 
SELECT dbms_metadata.GET_DEPENDENT_DDL ('COMMENT', :name,:owner) FROM DUAL 

、それが適切にマテリアライズド・ビューのメタデータを生成します。私は(SQL開発者自身で手動でも、または)プログラムでこのスクリプトを実行すると、次のエラーを生成します。

ORA-31608: specified object of type COMMENT not found 
ORA-06512: at "SYS.DBMS_METADATA", line 5805 
ORA-06512: at "SYS.DBMS_METADATA", line 8436 
ORA-06512: at line 1 
31608. 00000 - "specified object of type %s not found" 
*Cause: The specified object was not found in the database. 
*Action: Correct the object specification and try the call again. 

は、この特定のビューは任意のコメント(明らかに)持っていませんが、私が期待しているだろうマテリアライズドこの節の部分は、エラーを生成する代わりに0行を返すだけです(特に、SQL Developerは一見エラーなしでこれを使用します)。

メタデータにコメントが含まれていても、このエラーを回避する方法はありますか?

この問題は、Oracle 10g & 11gデータベースに存在します。

+0

問題が許可されている可能性があります。あなたに与えた助成金を確認してください。 – SSD

+0

@ Saeidsamadidana:問題は助成金ではありません。 Sql Developerの同じユーザーです。これはコメントがあると成功します。 – Gerrat

+0

あなたはコメントがないときにそれが起こることを意味しますか? – SSD

答えて

2

commentなしでmviewを作成する方法がわからないため、テストできませんでした。ただし、下記の内容が有効です。コメントがないときには、dualの代わりにdba_mview_commentsを照会して機能を実行しないでください。

UNION ALL 
SELECT dbms_metadata.get_dependent_ddl ('COMMENT', :name, :owner) 
    FROM dba_mview_comments mvc 
WHERE mvc.mview_name = :name AND 
    mvc.owner = :owner AND 
    length(comments) > 0 AND 
    rownum = 1 
+0

私はここで同じエラーが発生します。 dba_mview_commentsには、テーブルにコメントを追加していないにもかかわらず、「null」コメントのレコードがあります。テーブルに '' 'のコメントを追加すると、元のエラー(またはここではエラー)が発生しません。 'dba_metadata.get_dependent_ddl'を実行しているときに照会している他のテーブルがなければなりません。 (あるいは、 'get_dependent_ddl'プロシージャのある種のバグかもしれません)。 – Gerrat

+0

追加の 'length(comments)> 0'を使ってクエリを変更しても問題ありません。主要なアイデアは、必要でないときに関数を呼び出さないことです。 – dcieslak

+0

Worksありがとうございます。 まだわかっています:a)これはsqlplusと ではなく、 'Quick DDL'を介してどのように動作するように見えますか?b)' '' 'のコメントと、 – Gerrat

関連する問題