1

MetaTableName 列に 48 個のテーブル名を挿入した 1 つのテーブル "Meta_Data_Table_Names" を作成しました。行数と対応するテーブル名を提供する別の列があります。

「Meta_Data_Table_Names」からテーブル名を取得し、検証のためにループを介して SELECT クエリを順次実行したいと考えました。TOAD から実行するたびに、エラーがスローされます: テーブルまたはビューが存在しません。

スキャン可能な「Meta_name」のプレースホルダーを作成する必要がありますか? または、クエリ中に値を読み取るための特定の構文はありますか?

DECLARE
    CURSOR c1 IS SELECT MetaTableName FROM Meta_Data_Table_Names;
    CURSOR c2 IS SELECT ROW_COUNT FROM Meta_Data_Table_Names;
    Meta_name  Meta_Data_Table_Names.MetaTableName%TYPE;
    Count_num Meta_Data_Table_Names.ROW_COUNT%TYPE;
BEGIN
    OPEN c1;
    OPEN c2;
    FOR i IN 1..48 LOOP
        FETCH c1 INTO Meta_name;
        FETCH c2 INTO Count_num;
        IF (Count_num > 2000)
           THEN
               SELECT * FROM  Meta_Name  X 
               MINUS  
               SELECT * from   ASFNCWK07.Meta_Name@NCDV.US.ORACLE.COM Y
               UNION ALL
               SELECT * FROM  ASFNCWK07.Meta_Name@NCDV.US.ORACLE.COM  Y 
               MINUS  
               SELECT  * FROM  Meta_Name  X;    
           ELSE    
               DBMS_OUTPUT.PUT_LINE ('No Validation is required');
        END IF;
    END LOOP;
END;
4

2 に答える 2

0

コードには多くの問題があります。

まず、通常の SQL では変数名を使用できません。これには動的 SQL が必要です。例えば:

 execute immediate 'select 1 from '|| Meta_Name || into n;

動的 SQL を操作する際には、多くの微妙な点があります。PL/SQL のドキュメントでは、1 章全体を説明しています。 詳細をご覧ください

次に、PL/SQL で SQL を実行する場合、ターゲット変数を提供する必要があります。これは、実行されたクエリの射影と一致する必要があります。行全体を選択する場合、%ROWTYPEキーワードが役立ちます。繰り返しますが、ドキュメントはこれをカバーしています:詳しく見る. につながる...

第 3 に、動的 SQL を使用しており、どのテーブルがスコープ内にあるかが事前にわからないため、ターゲット変数を簡単に宣言できません。これは、ref カーソルやタイプ 4 の動的 SQL 手法を使用する必要があることを意味します。うわぁ!Adrian Billington の優れたブログ記事をここで読んでください

最後に (私が思うに)、クエリの UNION ALL では、どの行がどこから欠落しているかを特定できません。おそらくそれは問題ではありません。

于 2013-11-07T07:20:15.103 に答える