2017-01-12 14 views
-3
DECLARE 
CURSOR c1 
IS 
    SELECT view_name 
    FROM all_views 
    WHERE owner = 'DBA_A' 
    AND view_name LIKE 'IRV_%' 
    OR view_name LIKE 'RD_%' 
    ORDER BY view_name; 
BEGIN 
FOR i IN c1 
LOOP 
    FOR ii IN ('select * FROM DBA_A.' || i.VIEW_NAME || ' minus select *  FROM DBA_B.' || i.VIEW_NAME) 
    LOOP 
    -- I plan to put the results from the select in the FOR ii loop in a listAgg. I think I can figure that out. 
    dbms_output.put_line(listAgg); 
    END LOOP; -- for ii 
END LOOP; -- for i 
END; 

次のエラーが発生します。おそらく私が探求しているシンタックスの構文ですが、私がiiループでやろうとしているのは正気に見えますか?私はlistAgg関数の使い方を工夫しなければなりません。pl sql select * from owner.view1マイナスselect * from forループ内のカーソルとしてowner2.view1

ありがとうございます。

END LOOPでエラーが生成されました。 - II

PLS-00103のために次のいずれかを期待したときにシンボル "END" を検出しました:

DBMS_OUTPUT.PUT_LINEが生成され、適切な選択を示しています。再度、感謝します。リッチ

ありがとうございますAleksej。テーブル/ビューには多くのフィールドがあります。しかし、私はテーブルではなくビューを比較しようとしています。ビューは2つの別々のスキーマにあります。どちらのスキーマ・オブジェクトもまったく同じです(DBA_AをDBA_Bにコピーしました)。しかし、1つのスキーマで1つのビューの基本表を変更しました。

DBA_B.view1 ...からのselect * from DBA_A.view1 .... minus select *は、ハードコードされたschema.viewの名前でselect/minusをハードコードすると機能します。 selectは、変更されたデータを持つビューの1つの行を返します。ループの中にあるビューのすべての列名を返す方法があると思います。 dbms_output.putline(listAggを使用)を列名のリストと、返された行のデータに対して実行したいとします。

私は十分に明確でない場合は申し訳ありません。あなたのサンプルコードをありがとうございました。あなたの例に基づいて自分のコードを変更し、結果を投稿します。あなたに

は私がカップルに比較したいテーブルを持っていると言う動的なコードにいくつかのヒントを与えるために、あなたの質問を簡素化しようとすると

+0

コードにはいくつか問題がありますが、何をする必要があるのか​​不明なので、手伝いが難しいです。たとえば、最初のクエリでビューを見つけたとし、マイナスをして5列の10レコードを取得したとします。これらのレコードで何をしたいですか?ダイナミッククエリが返す列を事前に把握していないという事実をどうやって処理できますか?人々があなたを助けるために[mcve]を構築しようとしてください – Aleksej

+0

こんにちは。私はちょうど(任意のコードブロックの外)を選択...マイナス...選択(* select.oracle.viewマイナスselect * owner2.viewでそれを手動でコーディング)私は1つのスキーマの基本テーブルを変更したビューselectはすべての列を含む行を返します。私はちょうどiiループ内に返された行のROWIDを取得し、dbms_output.put_line(ROWID)を実行したい。コードは決してiiループに入りません。私はそれが助けて欲しいありがとうございました! – user3797654

+0

[Dynamic SQL LOOP]の重複している可能性があります(http://stackoverflow.com/questions/21090673/dynamic-sql-loop) – OldProgrammer

答えて

0

。私はROWIDの問題を避けるためにテーブルを使用しています。簡単にするために、テーブル名を変更するだけで同じスキーマを使用します。 テーブル:

create table TABLE_A_1(id) as select 1 from dual union all select 2 from dual; 
create table TABLE_A_2(id) as select 2 from dual; 
create table TABLE_B_1(id) as select 3 from dual union all select 3 from dual; 
create table TABLE_B_2(id) as select 4 from dual; 

は、私はid値をチェックし、TABLE_B_2に対してTABLE_A_2とTABLE_B_1に対してTABLE_A_1を比較したいと言います。私は、これはあなたに、動的SQLを使用する方法のアイデアを与えることができると信じて:

declare 
    cur sys_refcursor; 
    v number; 
begin  
    for tab in (select table_name from user_tables where regexp_like (table_name, 'TABLE_[AB]_1')) loop 
     open cur for 'select id from ' || tab.table_name || ' minus select id from ' || replace(tab.table_name, '1', '2'); 
     loop 
      fetch cur into v; 
      exit when cur%NOTFOUND; 
      dbms_output.put_line(tab.table_name || ' minus ' || replace(tab.table_name, '1', '2') || ': ' || v); 
     end loop; 
    end loop; 
end; 

これが与える:ここ

TABLE_A_1 minus TABLE_A_2: 1 
TABLE_B_1 minus TABLE_B_2: 3 

お知らせ二つの主な単純化を:

  • を私はすべてのことを想定しましたテーブルには1つのフィールドがあります。より一般的なケースでは、比較するビューが同じ構造を持つようにする必要があります。
  • 私はIDを使用して欠落行を特定しました。テーブル内ではrowidを使用している可能性がありますが、ビューrowidでは役に立たないので、他のビューに欠けているビュー内の行を識別する方法を見つける必要があります。

言い換えれば、完全な解決策を提供するためには、あなたの意見や欠落している行を特定するために使用する方法についてもっと知っておく必要があります。これらの情報がなければ、これはあなた自身の解決策を書くのに有益なヒントを含んでいます。

+0

ありがとうAleksej、 – user3797654

+0

答えがあなたのために正しいです、それを受け入れてください。 [ここで](http://stackoverflow.com/help/someone-answers)誰かがあなたに答えるときに何をすべきかを見つける。 – Aleksej

関連する問題