2017-05-16 8 views
2

同じ名前の事前作成済表にマテリアライズド・ビューがあります。 DBMS_METADATA.GET_DDL()を使用して、マテリアライズド・ビューのDDLを取得しようとしたときに、ORA-01427:単一行サブクエリが複数の行を戻しますからを戻します。ここで、最小の例は次のとおり事前ビルドされた表のマテリアライズド・ビューのDDLを取得する - 単一行のサブクエリを取得する

SQL> create table mv_test as select * from dual; 

Table created. 

SQL> create materialized view mv_test 
    2 on prebuilt table 
    3 refresh force on demand as 
    4 select * 
    5 from dual; 

Materialized view created. 

SQL> select dbms_metadata.get_ddl('MATERIALIZED_VIEW', 'MV_TEST', user) from dual; 
ERROR: 
ORA-01427: single-row subquery returns more than one row 
ORA-06512: at "SYS.DBMS_METADATA", line 5746 
ORA-06512: at "SYS.DBMS_METADATA", line 8333 
ORA-06512: at line 1 



no rows selected 

SQL> 

PL/SQL内でSQLを使用する場合、PL/SQLの変数に直接割り当てるとき、同じエラーが発生します。

これは特に最適ではありません...テーブルとマテリアライズドビューの名前が同じで、GET_DDL()が複数の行をSELECTに返すため、エラーが発生していると仮定します。

マテリアライズド・ビューの行は1行だけ必要です。私はGET_DDL()への呼び出しでこれを指定しました。 I テーブルのDDLを返すしません。

さらにいくつかのポイント:

  • list of object types available in DBMS_METADATA
  • 表もマテリアライズド・ビューのいずれもが
  • エディションされる事前に構築されたテーブルの上にマテリアライズド・ビューとマテリアライズド・ビューの区別をしませんOracleバージョン12.1.0.1

のみマテリアライズド・ビューのDDLを取得できます。

+0

「DBMS_METADATA」の5746行目と8333行目に何か問題が発生しています(おそらく、5733の呼び出し元までカスケード接続する8333の呼び出し)。オラクルだけが、コードのその時点で何をしようとしているのかを知っています。それは私のために12.1.0.2で動作します。 'v $ open_cursor'を' v $ sql'と 'dba_objects'を使って' DBMS_METADATA% 'と一致するオブジェクトにカーソルを合わせると、私はこれらの行から何も見ませんでした。 12.1.0.2で修正されたのかもしれない。興味深い。 –

+0

しかし、私はテーブルと同じ名前のビューを持っていないだろう。あなたのテーブルに 'sometest'とMVの' sometest_mv'という名前をつけてください。 – unleashed

+0

バグに見える、ベン。 MVとMVが構築されているテーブルは同じ名前でなければなりません。それは問題の原因ではありません。同様のバグがあります(#15922287登録済み、エディション対応のビューのDDLを取得しようとすると 'ORA-01427'が発生します - 12.1.0.2.0で修正)。 12.1.0.2.0でテストされました。エラーはありません。 –

答えて

0

このエラーについては、マテリアライズド・ビューに対していくつかのバグがありますが、テーブルとマテリアライズド・ビューの同じ名前は関係ありません。 あなたは次のことを行う必要があります:

  • Oracle Metalinkでエラーを探します。
  • メタルリンクに関するオラクルのメモを調べてください。
  • 必要に応じて、Oracle SupportにSRを開いて管理します。
  • このバグや問題の回避策またはパッチを見つけます。
関連する問題