同じ名前の事前作成済表にマテリアライズド・ビューがあります。 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を取得できます。
「DBMS_METADATA」の5746行目と8333行目に何か問題が発生しています(おそらく、5733の呼び出し元までカスケード接続する8333の呼び出し)。オラクルだけが、コードのその時点で何をしようとしているのかを知っています。それは私のために12.1.0.2で動作します。 'v $ open_cursor'を' v $ sql'と 'dba_objects'を使って' DBMS_METADATA% 'と一致するオブジェクトにカーソルを合わせると、私はこれらの行から何も見ませんでした。 12.1.0.2で修正されたのかもしれない。興味深い。 –
しかし、私はテーブルと同じ名前のビューを持っていないだろう。あなたのテーブルに 'sometest'とMVの' sometest_mv'という名前をつけてください。 – unleashed
バグに見える、ベン。 MVとMVが構築されているテーブルは同じ名前でなければなりません。それは問題の原因ではありません。同様のバグがあります(#15922287登録済み、エディション対応のビューのDDLを取得しようとすると 'ORA-01427'が発生します - 12.1.0.2.0で修正)。 12.1.0.2.0でテストされました。エラーはありません。 –